Validação do modelo com propriedades enumeráveis no ASP.NET MVC2 RTM
-
21-09-2019 - |
Pergunta
estou a usar DataAnnotations
atributos para validar meus objetos de modelo. Minha classe modelo parece semelhante a isso:
public class MyModel
{
[Required]
public string Title { get; set; }
[Required(ErrorMessage = "At least one editor is required.")]
public List<User> Editors { get; set; }
}
public class User
{
public int Id { get; set; }
[Required]
public string FullName { get; set; }
[Required]
[DataType(DataType.Email)]
public string Email { get; set; }
}
Minha ação do controlador se parece:
public ActionResult NewItem(MyModel data)
{
if (!this.Model.IsValid)
{
// invalid processing
}
// valid processing
}
O usuário é apresentado com uma visão que possui um formulário com:
- Uma caixa de texto com nome fictício onde os usuários inserem os nomes do usuário. Para cada usuário em que eles entram, há um script de cliente juntamente com Ajax que cria um
<input type="hidden" name="Editors[0].Id" value="userId" />
Para cada usuário inserido (o índice de enumeração nem sempre é 0, como escrito aqui), portanto, o Binder padrão do modelo é capaz de consumir e vincular o formulário sem problemas. - uma caixa de texto onde os usuários inserem o título
Já que estou usando ASP.NET MVC 2 RTM que modelam a validação em vez de validação de entrada, não sei como evitar erros de validação. E já que os usuários fornecem User.Id
, o todo User
A instância do objeto está sendo validada. O que não me incomoda, desde que eu saiba como excluir a validação de outras propriedades.
O problema é que tenho que usar BindAttribute
na minha ação do controlador. Eu teria que fornecer uma lista branca ou preta de propriedades. É sempre uma prática melhor fornecer uma lista branca. Também é mais uma prova futura.
O problema
Meu formulário funciona bem, mas recebo erros de validação sobre o usuário FullName
e Email
propriedades, uma vez que não são fornecidas. Também não devo alimentá -los com o cliente (via AJAX quando o usuário inserir dados do usuário), porque o email é dados de contato pessoal e não é compartilhado entre os usuários.
Se houve apenas uma única referência de usuário em MyModel
eu escreveria
[Bind(Include = "Title, Editor.Id")]
Mas eu tenho uma enumeração deles. Como eu forneço Bind
Lista branca para trabalhar com meu modelo?
Uma solução possível
Eu poderia criar um modelo de visão separado para User
Apenas por uma questão de inserir objetos mymodel. Eu colocaria atributos de validação reais e omitia propriedades de que não preciso.
public class MyModelUser
{
[Required]
public int Id { get; set; }
}
Solução
Acabei usando um modelo de exibição separado (como descrito em Uma solução possível na minha pergunta), isso pode ser totalmente validado. É uma solução alternativa e eu ainda gostaria de saber como fazê -lo corretamente.