Pergunta

Primeiro de tudo, algum contexto:

Eu tenho um formulário, onde publico alguns objetos que são automaticamente materializados em objetos por MVCS embutido Modelbinder:

<input type="hidden" name="myobj[0].Id" />
<input type="text" name="myobj[0].Hours" />
<input type="hidden" name="myobj[1].Id" />
<input type="text" name="myobj[1].Hours" />

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Save(IList<MyObject> myobj);

Além disso: gostaria de enfatizar que estamos postando no DTO (DataTransferObjects) que ainda mais adiante no mapa de linha em entidades da estrutura da entidade, por isso preferimos não gostar da mudança nada nos DTOs, exceto talvez adicionando atributos.

Problema

Se um usuário inserir um valor inválido para "horas", digamos 'Fubar', o Modelbinder naturalmente não tentará definir a propriedade 'horas'. Mas o padrão é 0, porque é um int e não um corda.

Isso causa alguma dificuldade para mim, é claro, porque agora não consigo ver se o usuário realmente inseriu 0, ou se isso foi causado por entrada inválida.

Como estou usando um mapeador de objeto para entrada (estrutura de entidade), que não podemos alterar a impressão dos pés da propriedade 'horas' para int?. Estou ciente de que o MVC tem alguns validação incorporada, mas preferimos não implementar isso, pois sabemos que foi atacado muito e que há uma nova validação chegando no ASP.NET MVC 2.0.

Solução?

Eu preciso ser capaz de apontar para o usuário qual campo está incorreto, então isso significa que de alguma forma eu preciso ser capaz de capturar uma exceção (ou possivelmente alguma outra solução engenhosa?), Onde posso fazer alguma lógica e postar um novo Vista para o usuário em que esclaro o que eles fizeram incorretamente.

Minha ideia atual: escrevendo um Modelbinder personalizado.

O que você sugere?

Foi útil?

Solução

Isso causa alguma dificuldade para mim, é claro, porque agora não consigo ver se o usuário realmente inseriu 0, ou se isso foi causado por entrada inválida.

Sim você pode. Olhe no ModelState.

Outras dicas

Embora isso não seja particularmente ideal, você afirmou que não quer mudar mais nada. Portanto, a opção que você mencionou, criar um ModelBinder personalizado funcionará bem. No entanto, você pode criar um ModelBinder para cada entidade que deseja vincular.

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