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; }
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top