Pregunta

Tengo más que un poco de dificultad para tratar de depurar por qué MVC no es vinculante 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 infantil complejo: actividad.location.state (donde la actividad es el objeto complejo que la acción espera, la ubicación es un objeto infantil complejo y el estado es solo una cadena) .

Ahora configuré un proyecto de prueba que, por lo que puedo decir, imita exactamente el escenario realmente que tengo, en este caso de prueba, el vinculante funciona ... pero en mi proyecto realmente, el enlace a la actividad funciona pero no a la ubicación ... Al poner puntos de descanso 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 tratando de depurar el problema, pero necesito acceso a los símbolos MVC V2 Preview 2 que parece que no puedo rastrear ... Me gustaría ver lo que realmente está haciendo una vez que extrae el objeto de ubicación (para algunos Razón creo que podría estar fallando internamente pero tragando la excepción).

Cualquier idea sobre lo que podría hacer aquí ...

Saludos Anthony

ACTUALIZAR:

Ok, hice lo que JW sugirió y hace referencia directamente al proyecto MVC ...

Encontré el problema y había una diferencia muy pequeña que pasé por alto ... Como resultado, descubrí que MVC actualmente no admite múltiples niveles de herencia de interfaz cuando se trata de vinculación del modelo ... vea 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 ilocación, pero cuando getModelProperties se ejecuta dentro del valor predeterminado que 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 en este punto que TypedescriptionProvider no es compatible con este estilo de herencia, por lo que me sorprende bastante. También mirando la fuente V1, parece que esto se introdujo con V2, pero V1 podría no haber podido respaldar lo que estoy tratando de hacer de todos modos.

No diría que esto es realmente un error, pero intenté 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 que ocurriría con la suficiente frecuencia como para ser atendida. Gracias por la respuesta.

Salud

¿Fue útil?

Solución

Resulta que este comportamiento se debe por diseño debido a cómo funciona la herencia de la interfaz. Las interfaces no definen las implementaciones, por lo que la ilocación no "herede" las propiedades de IlocationSource. Más bien, la ilocación solo define lo que debe implementar una implementación concreta.

Para ver todos los detalles completos, incluida la sección de la especificación de la CLI (infraestructura de lenguaje común) que define este comportamiento, consulte: http://haacked.com/archive/2009/11/10/interface-inheritance-esoterica.aspx

Otros consejos

Simplemente haré referencia al código fuente ASP.NET MVC2 publicado en CodePlex. Lo hice, es muy sencillo.

Le dará una comprensión mucho mejor cuando debuges el código fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top