69 votes

Asp MVC - Message de validation "Le champ Id est obligatoire" sur Créer; L'identifiant n'est pas défini sur [Obligatoire]

Ce qui se passe lorsque j'essaie de créer l'entité à l'aide d'un de Créer un style d'action dans Asp.Net MVC 2.

Le POCO a les propriétés suivantes:

public int Id {get;set;}

[Required]
public string Message {get; set}

Sur la création de l'entité, le code est défini automatiquement, il n'est pas besoin pour cela sur l'action de création.

Le ModelState dit que "Le champ Id est nécessaire", mais je n'ai pas mis que de l'être. Est-il quelque chose d'automatique qui se passe ici?

MODIFIER la Raison, a Révélé

La raison pour laquelle la question est répondu par Brad Wilson, par Paul Speranza dans un des commentaires ci-dessous, où il dit (bravo Paul):

Vous êtes à fournir une valeur pour ID, vous venez de ne pas vous connaître ont été. C'est dans la route de données de la valeur par défaut itinéraire ("{controller}/{action}/{id}"), la valeur par défaut est vide la chaîne, qui n'est pas valide pour un int. L'utilisation de la [Lier] attribut sur votre le paramètre action d'exclure ID. Mon la route par défaut est: nouveau { controller = "Client", action = "Modifier", id = " " } // Valeurs par défaut des paramètres

EDIT - Modèle de mise à Jour technique

J'ai effectivement changé la façon dont je l'ai fait de nouveau en utilisant tryupdatemodel pour mettre et de les exclure de tableau de paramètres asscoiated.

    [HttpPost]
    public ActionResult Add(Venue collection)
    {
        Venue venue = new Venue();
        if (TryUpdateModel(venue, null, null, new[] { "Id" }))
        {
            _service.Add(venue);
            return RedirectToAction("Index", "Manage");
        }
        return View(collection);
    }

86voto

Rosstified Points 2327

Vous pouvez ajouter l'attribut:

  [Bind(Exclude = "Id")] 
 

sur le paramètre dans la méthode plutôt que sur la classe, de cette façon sur create, vous pouvez l'exclure et sur edit, il sera toujours obligatoire:

 public ActionResult Create([Bind(Exclude = "Id")] User u)
{
    // will exclude for create
}

public ActionResult Edit(User u)
{
    // will require for edit
}
 

18voto

Ulises Points 4893

J'ai rencontré ce problème avec un formulaire dans lequel j'ajoutais des "objets" à une liste de manière dynamique. Par conséquent, nos utilisateurs ont pu ajouter, supprimer ou mettre à jour. Tout a bien fonctionné, sauf dans les cas où de nouveaux éléments ont été créés. Pour cette raison, dans mon cas, exclure la propriété Id n'était pas une option . La solution consistait à rendre l'ID Nullable :

 public int? Id { get; set; }
 

De cette façon, les éléments existants auront une valeur et les nouveaux auront la valeur null. Bon produit.

11voto

Andrei Rînea Points 7554

Excellente question et réponses, m'a sauvé ... derrière. J'ai besoin d'ajouter quelque chose, cependant:

Au lieu de

[Bind(Exclude = "Id")]

Je pense qu'il est préférable d'utiliser

[Bind(Include = "Prop1, Prop2, Prop3, etc")]

.. où Prop1, Prop2 et Prop3 sont LES SEULES propriétés que vous souhaitez être lié au niveau de l'action.

Puisque c'est par liste blanche par opposition au noir de liste. Liste blanche est meilleur, plus sûr. De cette façon, vous aussi résoudre le risque de plus de détachement et en vertu de l'affichage. Voir Brad Wilson post.

7voto

Barbaros Alp Points 3439
 [Bind(Exclude = "Id")]
public class Hebe
{
      public int Id {get;set;}

      [Required]
      public string Message {get; set}
}
 

En passant, il ne lie pas la propriété Id de votre modèle lors de la création.

2voto

Paul Speranza Points 423

J'ai le même problème, en utilisant RC2 avec un POCO. Si vous nommez un identifiant de propriété mais ne lui attribuez pas d'attributs de validation, IsValid indique qu'il est obligatoire. Si je nomme une propriété autre chose que Id, cela ne se produit pas. Pourquoi devrais-je exclure Id?

Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X