2011-11-01 6 views
7

Me estoy confundido por este problema y no estoy seguro si es mi falta de comprensión del marco MVC, el marco .NET, o qué. Pero aquí se apreciará alguna explicación desde cualquier rincón.propiedad interfaz heredados no se encontró por modelo de unión

Lo que estoy tratando de hacer: utilizar ASP.NET MVC3 modelo de unión para hacer controles HTML en una vista. Específicamente, estoy intentando vincularme a una interfaz en lugar de a una clase concreta.

El error: un ArgumentException "La propiedad [bla] no se puede conocer." se lanza durante la carga de la página.

El código:

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

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

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

La vista:

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

Cuando intento cargar la vista, un ArgumentException se lanza desde la llamada a EditorFor() que indica que la propiedad del ID no puede encontró. Sin embargo, si me uniera a la clase Concrete, el enlace funciona bien.

Así que ¿alguien sabe por qué EditorFor() no sería capaz de resolver la propiedad heredada de la interfaz de base?

+0

Trate de usar una clase abstracta. – wnascimento

+1

Eso es lo que comencé a hacer: escribir clases abstractas que implementen mis interfaces. Mis clases concretas pueden heredar y anular los resúmenes y (actualmente) tengo mis vistas vinculantes para los resúmenes también. No estoy seguro de si el enlace a las clases base abstractas va a funcionar para las vistas en el largo plazo: Kaleb a continuación sugiere implementar clases de ViewModel para el enlace. Soy reacio a comenzar ese camino en este momento, pero eventualmente puedo terminar allí. –

+0

El consejo de Kaleb es excelente, Automapper/ViewModels es una buena opción. – wnascimento

Respuesta

8

En base/abstracto y clases concretas, propiedades, métodos, etc. están presentes. Las interfaces, por otro lado, están implementadas. Reglas impuestas por CLR.

ver este artículo que explica acerca ModelBinding y la relación de esta diferencia (clase X Interface).

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

creo que es su respuesta.

+1

Gracias, eso lo aclaró para mí. 'Por supuesto, también plantea una serie de preguntas sobre cómo voy a administrar mis clases de dominio y a qué clases deberían ser vinculantes mis opiniones, ¡pero eso será forraje para futuras preguntas de SO! –

+1

Eche un vistazo a [AutoMapper] (http://automapper.org/) para saber a qué clases deben asignarse sus vistas. El resumen rápido: cree modelos específicos de la vista (es decir, vea Modelos) y asigne sus clases de dominio a los modelos específicos de la vista usando algo como 'AutoMapper'. También puede crear su propia carpeta de modelo. –

Cuestiones relacionadas