La validación del modelo con propiedades enumerables Asp.net MVC2 RTM
-
21-09-2019 - |
Pregunta
Estoy usando DataAnnotations
atributos para validar mis objetos del modelo. Mi clase de modelo es similar a esto:
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; }
}
Mi acción del controlador se ve así:
public ActionResult NewItem(MyModel data)
{
if (!this.Model.IsValid)
{
// invalid processing
}
// valid processing
}
usuario se le presenta una vista que tiene una forma con:
- un cuadro de texto con el nombre ficticio que los usuarios introducen los nombres de los usuarios. Para cada usuario que entran, hay un script de cliente junto con el Ajax, que crea una
<input type="hidden" name="Editors[0].Id" value="userId" />
para cada usuario introducido (índice de enumeración, por tanto, no es siempre 0 como está escrito aquí), por lo ligante modelo por defecto es capaz de consumir y de obligar a la forma sin ningún problema. - un cuadro de texto donde los usuarios entran en el título
Desde que estoy usando Asp.net MVC 2 RTM que realiza la validación de modelos en lugar de validación de entrada que no sé cómo evitar los errores de validación. Y puesto que los usuarios proporcionan User.Id
, está siendo validada toda la instancia del objeto User
. Lo cual no me molesta, siempre me gustaría saber cómo excluir la validación de otras propiedades.
Lo que pasa es que tengo que usar BindAttribute
en mi acción del controlador. Tendría que proporcionará una blanca o una lista de negro de propiedades. Siempre es una mejor práctica para proporcionar una lista blanca. Es también una prueba más futuro.
El problema
Mi forma funciona bien, pero me da errores de validación sobre las propiedades FullName
y Email
del usuario, ya que no se proporcionan. Tampoco les debe alimentar al cliente (a través de AJAX cuando el usuario introduce datos de usuario), porque el correo electrónico es la información de contacto personal y no se comparte entre los usuarios.
Si sólo había una sola referencia de usuario en MyModel
me gustaría escribir
[Bind(Include = "Title, Editor.Id")]
Pero tengo una enumeración de ellos. ¿Cómo puedo proporcionar la lista Bind
blanco para trabajar con mi modelo?
Una posible solución
Podría crear un modelo de vista separado para User
por el simple hecho de introducir objetos MyModel. Yo pondría atributos de validación reales y omitir propiedades que no necesito.
public class MyModelUser
{
[Required]
public int Id { get; set; }
}
Solución
Terminé usando un modelo de vista independiente (como se describe en Una posible solución en mi pregunta), que puede ser completamente validados. Es una solución alternativa y aun así me gustaría saber cómo hacerlo correctamente.