Question

J'utilise DataAnnotations attributs pour valider mes objets de modèle. Ma classe de modèle ressemble à ceci:

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; }
}

Mon action du contrôleur ressemble à:

public ActionResult NewItem(MyModel data)
{
    if (!this.Model.IsValid)
    {
        // invalid processing
    }
    // valid processing
}

L'utilisateur est présenté avec une vue qui a une forme avec:

  • une zone de texte avec le nom fictif où les utilisateurs entrent le nom de l'utilisateur. Pour chaque utilisateur, ils entrent, il y a un script client couplé avec ajax qui crée une <input type="hidden" name="Editors[0].Id" value="userId" /> pour chaque utilisateur inscrit (index d'énumération est donc pas toujours 0 comme écrit ici), donc liant modèle par défaut est capable de consommer et de lier la forme sans aucun problème.
  • une zone de texte où les utilisateurs entrent dans le titre

Depuis que je suis en utilisant Asp.net MVC 2 RTM qui fait la validation des modèles au lieu de validation d'entrée, je ne sais pas comment éviter les erreurs de validation. Et puisque les utilisateurs fournissent User.Id, toute instance d'objet User est en cours de validation. Ce qui ne je ne saurais me dérange pas, tant comment exclure la validation des autres propriétés.

La chose est que je dois utiliser BindAttribute sur mon action du contrôleur. Je dois fournir soit une blanche ou une liste noire des propriétés. Il est toujours une meilleure pratique de fournir une liste blanche. Il est également une preuve plus d'avenir.

Le problème

Ma forme fonctionne très bien, mais je reçois des erreurs de validation sur les propriétés de FullName de l'utilisateur et Email car ils ne sont pas fournis. Je ne devrais pas les nourrir aussi au client (via ajax lorsque l'utilisateur entre les données utilisateur), car email est des données de contact personnelles et ne sont pas partagées entre les utilisateurs.

S'il y avait une seule référence d'utilisateur sur MyModel j'écrirais

[Bind(Include = "Title, Editor.Id")]

Mais j'ai une énumération d'entre eux. Comment puis-je fournir une liste blanche Bind à travailler avec mon modèle?

Une solution possible

Je pourrais créer un modèle de vue distinct pour User juste pour le plaisir d'entrer des objets MyModel. Je mettrais les attributs de validation réels et d'omettre les propriétés que je ne ai pas besoin.

public class MyModelUser
{
    [Required]
    public int Id { get; set; }
}
Était-ce utile?

La solution

J'ai fini à l'aide d'un modèle de vue séparé (comme décrit dans Une solution possible dans ma question), qui peut être entièrement validé. Il est une solution de contournement et je voudrais encore savoir comment le faire correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top