Pergunta

Eu quero uma lista de diferentes (derivados) tipos de objetos que trabalham com o padrão ModelBinder em Asp.net MVC 2.

Eu tenho o seguinte ViewModel:

public class ItemFormModel
    {       
        [Required(ErrorMessage = "Required Field")] 
        public string Name { get; set; }
        public string Description { get; set; }

        [ScaffoldColumn(true)]
        //public List<Core.Object> Objects { get; set; }       
        public ArrayList Objects { get; set; }                  
    }

E a lista contém objetos de tipos derivados diffent, por exemplo.

public class TextObject : Core.Object
    {
        public string Text { get; set; }
    }

    public class BoolObject : Core.Object
    {
        public bool Value { get; set; }
    }

Não importa se eu usar a lista ou a implementação ArrayList, tudo get está bem scaffolded na forma, mas o ModelBinder não resolve as propriedades derivadas de tipo de objeto para mim quando postar de volta para o ActionResult.

O que poderia ser uma boa solução para a estrutura viewmodel para obter uma lista de diferentes tipos de objetos manipulados? Ter uma lista extra para cada tipo de objeto (por exemplo, List, lista etc.) parece não ser uma boa solução para mim, uma vez que este é um monte de sobrecarga, tanto na construção do viewmodel e mapeá-lo de volta para o modelo de domínio.

Pensando na outra abordagem de ligar todas as propriedades em um fichário de modelo personalizado, como posso fazer usar os dados anotações abordar aqui (validando atributos necessários etc.) sem muita sobrecarga?

Foi útil?

Solução

Confira o Derivado Tipo ModelBinder em MvcContrib . Isso permite que você modelbind para tipos derivados através do processo de 'typestamping' - que é feita automaticamente para você quando usando o ajudante RenderTypedPartial (...). parciais MVCContrib manter o estado de ligação através parciais assim os prefixos Nome / id são devidamente mantidas em um objeto gráfico de profundidade. Se você usar outros mecanismos como a templates, então você vai precisar para lidar com a typestamping si mesmo. Isto é explicado na página de documentação.

Voltando às suas perguntas e como os tipos derivados são resolvidos com o ModelBinder, você pode registrar as variações de tipo derivados com atributos em um mecanismo semelhante ao WCF KnownTypeAttribute ou você pode fazer o registro na inicialização. De qualquer forma, essas variações são registradas uma vez e segurou por considerações de desempenho.

O ligante modelo também resolve este problema de uma forma que não interfere com os atributos de dados anotação / validação. Eles vão trabalhar como você espera que eles em qualquer outro cenário.

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