Pergunta

Estou tendo mais do que um pouco de dificuldade em tentar depurar por que o MVC não está vinculado corretamente em um determinado caso que tenho ...

Basicamente, tenho minha ação que recebe um objeto complexo que, por sua vez .

Agora eu configurei um projeto de teste que, até onde posso dizer exatamente imita o cenário que tenho, neste caso de teste, a ligação funciona ... mas no meu projeto realmente, a ligação à atividade funciona, mas não ao local ... Ao colocar pontos de interrupção na propriedade Locaaito, posso dizer que o MVC está recuperando o objeto de localização complexo da atividade, mas não está definindo nenhuma das propriedades ...

Estou tentando depurar o problema, mas preciso acessar os símbolos do MVC V2 Visuew 2 que não consigo rastrear ... Gostaria de ver o que ele realmente está fazendo quando ele retira o objeto de localização (para alguns razão pela qual acho que pode estar falhando internamente, mas engolindo a exceção).

Quaisquer ideias sobre o que eu poderia fazer aqui ...

Saúde Anthony

ATUALIZAR:

Ok, eu fiz o que o JW sugeriu e referenciou diretamente o projeto MVC ...

Encontrei o problema e houve uma diferença muito pequena que eu esqueci ... Como resultado, descobri que o MVC atualmente não suporta vários níveis de herança da interface quando se trata de encadernação do modelo ... veja o seguinte ...

//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)
{
}

Portanto, o que eu descobri é que o MVC encontra o local e lê seu meta -tipo como uma ilocação, mas quando o getModelProperties é executado dentro do defaultModelBinder, ocorre o seguinte - ocorre - ocorre

    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
    }

Portanto, estou assumindo que, neste momento, o TypeDescriptionProvider não suporta esse estilo de herança, pelo qual estou bastante surpreso. Também olhando para a fonte V1, parece que isso foi introduzido com a V2 - mas a V1 pode não ter sido capaz de apoiar o que estou tentando fazer de qualquer maneira.

Eu não diria que isso é realmente um bug, mas tentei substituir minhas interfaces por aulas de concreto e funcionou bem. Portanto, o comportamento não é realmente o que eu esperaria e é um pouco inconsistente.

Alguma ideia??? Eu teria pensado que essa herança não era bastante padrão, mas ocorreria com frequência suficiente para serem atendidos. Obrigado pela resposta.

Felicidades

Foi útil?

Solução

Acontece que esse comportamento é por design devido à forma como a herança da interface funciona. As interfaces não definem implementações, portanto, a ilocação não "herda" as propriedades do Ilocationsource. Em vez disso, a ilocação define apenas o que uma implementação concreta deve implementar.

Para obter detalhes completos, incluindo a seção da CLI (Common Language Infrastructure), que define esse comportamento, confira: http://haacked.com/archive/2009/11/10/interface-fheritance-esoterica.aspx

Outras dicas

Eu simplesmente fazia referência ao código -fonte ASP.NET MVC2 publicado no CodePlex. Eu fiz isso, é muito direto.

Isso lhe dará um entendimento muito melhor ao depurar o código -fonte.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top