2011-11-01 16 views
7

Jestem zaskoczony przez ten problem i nie jestem pewien, czy to mój brak zrozumienia struktury MVC, platformy .NET, czy co. Ale niektóre wyjaśnienia z dowolnego zakątka zostałyby tutaj docenione.Dziedziczona właściwość interfejsu nie została znaleziona przez powiązanie z modelem

Co próbuję zrobić: użyć powiązania modelu ASP.NET MVC3 do renderowania formantów HTML w widoku. W szczególności próbuję powiązać interfejs zamiast konkretnej klasy.

Błąd: wyjątek ArgumentException "Właściwość [bla] nie została znaleziona." jest generowany podczas ładowania strony.

Kod:

Interface IFoundation 
{ 
    int Id { get; set; } 
} 

Interface IChild: IFoundation 
{ 
    string Name { get; set; } 
} 

Class Concrete: IChild 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
} 

Widok:

@model IChild 
@Html.EditorFor(x => x.Id) 

Kiedy próbuję załadować widoku ArgumentException jest wyrzucany z wezwania do EditorFor() stwierdzające, że nieruchomość Id nie może być uznany. Jeśli jednak powiążę się z klasą Concrete, bindowanie działa dobrze.

Czy ktoś wie, dlaczego EditorFor() nie byłby w stanie rozwiązać dziedziczonej właściwości z interfejsu podstawowego?

+0

Spróbuj użyć zajęć abstrakcyjnych. – wnascimento

+1

Tak właśnie zacząłem: pisanie klas abstrakcyjnych, które implementują moje interfejsy. Moje konkretne klasy mogą następnie dziedziczyć i nadpisywać abstrakty oraz (w chwili obecnej) moje poglądy są również wiążące dla streszczeń. Nie jestem pewien, czy powiązanie z abstrakcyjnymi klasami bazowymi będzie działało dla widoków w dłuższej perspektywie - Kaleb poniżej sugeruje implementację klas ViewModel dla powiązania. Nie jestem chętny do rozpoczęcia tej drogi w tej chwili, ale w końcu mogę tam skończyć. –

+0

Porady Kaleba są świetne, Automapper/ViewModels jest dobrym rozwiązaniem. – wnascimento

Odpowiedz

8

W klasach bazowych/abstrakcyjnych i konkretnych znajdują się właściwości, metody itp. Z drugiej strony implementowane są interfejsy. Reguły narzucone przez CLR.

Zobacz ten artykuł, w którym wyjaśniono zagadnienie dotyczące wiązania modelu i związku tej różnicy (interfejs klasy X).

http://bradwilson.typepad.com/blog/2011/08/interface-attributes-class-attributes.html

myślę, że to jest odpowiedź.

+1

Dzięki, wyjaśniłem to dla mnie. Oczywiście, to również rodzi wiele pytań: jak mam teraz zarządzać swoimi klasami domen i na jakich zajęciach powinny być moje poglądy, ale to będą pasze dla przyszłych pytań SO! –

+1

Spójrz na [AutoMapper] (http://automapper.org/), na jakie klasy powinny być mapowane Twoje widoki. Krótkie podsumowanie: utwórz modele specyficzne dla widoku (tzn. Zobacz modele) i zamapuj klasy domeny na modele specyficzne dla widoku, używając czegoś takiego jak "AutoMapper". Możesz także utworzyć własny segregator. –

Powiązane problemy