modelbinding - ASP.net MVC v2-Problemas de enlace del modelo de depuración-¿ERROR?
data binding mvc (2)
Estoy teniendo más que un poco de dificultad intentando depurar por qué MVC no está vinculando correctamente en un caso dado que tengo ...
Básicamente, tengo mi acción que recibe un objeto complejo que a su vez tiene un objeto secundario complejo: Activity.Location.State (donde Activity es el objeto complejo que espera la acción, Location es un objeto secundario complejo y State es solo una cadena) .
Ahora configuro un proyecto de prueba que, por lo que puedo decir, imita exactamente el escenario real que tengo, en este caso de prueba el enlace funciona ... Pero en mi proyecto real, el enlace a la actividad funciona pero no a la ubicación ... Al poner puntos de ruptura dentro de la propiedad de Locaiton puedo decir que MVC está recuperando el objeto de ubicación complejo de la actividad, pero no está configurando ninguna de las propiedades ...
Estoy intentando depurar el problema, pero necesito acceder a los símbolos de la vista previa 2 de MVC que parece que no puedo rastrear ... Me gustaría ver qué está haciendo realmente una vez que extrae el objeto de ubicación (para algunos razón por la que creo que podría estar fallando internamente pero tragándose la excepción).
Alguna idea sobre lo que podría hacer aquí ...
Saludos Anthony
ACTUALIZAR:
Ok, hice lo que JW sugirió y directamente hice referencia al proyecto MVC ...
Encontré el problema y hubo una pequeña diferencia que pasé por alto ... Como resultado, descubrí que MVC actualmente no admite múltiples niveles de herencia INTERFACE cuando se trata de vincular modelos ... Ver lo siguiente ...
//MODEL
public class Location : ILocation
{
...
}
public interface ILocation : ILocationCore
{
...
}
public interface ILocationCore //In my sample I didn''t have this second level interface
{
...
//MVC doesn''t find any of these properties
...
}
public class Activity : IActivity
{
...
}
public interface IActivity : IActivityCore
{
ILocation Location { get; set; } //MVC finds this and reads its meta type as an ILocation
//Also the implementation of this Location within Activity will always return a instance - our IoC takes care of that, so MVC should never have to create the instance
}
public interface IActivityCore
{
...
}
//CONTROLLER
public ActionResult Create(Activity activity)
{
}
Por lo tanto, lo que he encontrado es que MVC encuentra la ubicación y lee su meta tipo como una ubicación, pero cuando GetModelProperties se ejecuta dentro de DefaultModelBinder ocurre lo siguiente:
protected virtual PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) {
return GetTypeDescriptor(controllerContext, bindingContext).GetProperties();
//This return no properties
}
protected virtual ICustomTypeDescriptor GetTypeDescriptor(ControllerContext controllerContext, ModelBindingContext bindingContext) {
return new AssociatedMetadataTypeTypeDescriptionProvider(bindingContext.ModelType).GetTypeDescriptor(bindingContext.ModelType);
//bindingContext.ModelType - is ILocation
}
Por lo tanto, supongo que en este punto TypeDescriptionProvider no es compatible con este estilo de herencia, lo que me sorprende bastante. También mirando a la fuente v1 parece que esto fue presentado con v2 - pero v1 podría no haber sido capaz de soportar lo que estoy tratando de hacer de todos modos.
No diría que esto es realmente un error, pero traté de reemplazar mis interfaces con clases concretas y funcionó bien. Por lo tanto, el comportamiento no es realmente lo que esperaría y es un poco inconsistente.
¿¿¿Alguna idea??? Hubiera pensado que esta herencia no era bastante estándar, pero ocurriría con la suficiente frecuencia como para atenderla. Gracias por la respuesta.
Aclamaciones
Simplemente haría referencia al código fuente asp.net mvc2 publicado en codeplex. Lo hice, es muy sencillo.
Le dará una mejor comprensión cuando depure a través del código fuente.
Resulta que este comportamiento es por diseño debido a cómo funciona la herencia de la interfaz. Las interfaces no definen implementaciones, por lo que ILocation no "hereda" las propiedades de ILocationSource. Más bien, ILocation solo define qué debe implementar una implementación concreta.
Para obtener todos los detalles, incluida la sección de la especificación CLI (Common Language Infrastructure) que define este comportamiento, consulte: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx