Message de validation" The Id field is required " sur Create; Id Non défini à [Required]

cela se produit lorsque j'essaie de créer l'entity en utilisant une action Create style dans Asp.Net MVC 2.

le POCO possède 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 requis", mais je ne l'ai pas défini comme tel. Il se passe quelque chose d'automatique ici?

MODIFIER la Raison, a Révélé

la raison de la question Est répondu par Brad Wilson via Paul Speranza dans l'un des commentaires ci-dessous où il dit (santé Paul):

vous donnez une valeur pour ID, vous venez de ne pas vous connaître ont été. C'est dans les données de route 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 paramètre d'action pour exclure ID. Mon la route par défaut était : nouveau {controller = "Client", action = "Modifier", id = " " } / / Paramètre par défaut

EDITION - mise à Jour de la technique de modélisation

j'ai en fait changé la façon dont je l'ai fait à nouveau en utilisant TryUpdateModel et le tableau d'exclusion associé avec cela.

    [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);
    }
67
demandé sur Dan Beaulieu 2010-01-27 01:01:55

15 réponses

Vous pouvez ajouter l'attribut:

 [Bind(Exclude = "Id")] 

sur le paramètre dans la méthode plutôt que dans la classe, ainsi sur create vous pouvez l'exclure et sur edit il sera encore obligatoire:

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

public ActionResult Edit(User u)
{
    // will require for edit
}
82
répondu Rosstified 2010-01-27 04:45:20

j'ai rencontré ce problème avec une forme dans laquelle j'ajoutais des" objets " à une liste de façon dynamique. Par conséquent, nos utilisateurs ont pu ajouter, supprimer ou mettre à jour. Tout a bien fonctionné sauf pour les cas où de nouveaux éléments ont été créés. Pour cette raison, dans mon cas, excluant le bien Id n'était pas une option . la solution était de rendre L'ID null :

public int? Id { get; set; }

de Cette façon, les éléments existants ont une valeur et seront avoir null à la place. De bonnes choses.

17
répondu Ulises 2012-12-09 23:01:34

Excellente question et réponses, m'a sauvé ... derrière. Je dois ajouter quelque chose, cependant:

au lieu de

[Bind(Exclude = "Id")]

je pense qu'il est préférable d'utiliser des

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

.. où Prop1, Prop2 et Prop3 sont les seules propriétés que vous voulez lier au niveau de l'action.

Puisqu'il s'agit d'une inscription en blanc par opposition à une inscription en noir. La liste blanche est meilleure, plus sûre. Ce ainsi, vous résolvez également le risque de sur l'affichage et sous l'affichage aussi. Voir Brad Wilson post .

10
répondu Andrei Rînea 2010-06-15 08:29:10
[Bind(Exclude = "Id")]
public class Hebe
{
      public int Id {get;set;}

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

par la voie ci-dessus il ne lie pas la propriété Id pour votre modèle sur Créer

6
répondu Barbaros Alp 2010-01-26 23:09:29

l'Id doit être envoyé par le client comme 0. Le modèle N'a pas de problème avec Id=0, c'est la valeur par défaut de int. Le problème est qu'il ne voit pas la valeur venant du client ou elle vient avec l'espace ou null. J'ai une entrée cachée qui représente L'Id (ou dans l'objet complexe NestedPropertyId / NestedProperty.Id) donc je m'assure que ça commence avec une valeur de zéro.

<input type="hidden" id="id" value="0" />
<input type="hidden" id="eventId" value="0"/>
<input type="hidden" id="contactId" value="0"/>

aussi quand J'ajoute le formulaire pour ajouter une nouvelle entité du côté du client, je fais il est sûr d'initialiser le caché avec zéro.

J'espère que ça aidera quelqu'un.

Efy

5
répondu user1911353 2015-12-31 18:00:41

j'ai le même problème, en utilisant RC2 avec un POCO. Si vous nommez un ID de propriété mais que vous n'y mettez pas d'attributs de validation, IsValid dit que c'est nécessaire. Si je nomme une propriété n'importe quoi mais Id cela n'arrive pas. Pourquoi devrais-je exclure les pièces D'identité?

Merci

2
répondu Paul Speranza 2010-01-28 17:00:40

ajouter ? à l'int

[Key]
[HiddenInput(DisplayValue = false)]
public int? ID { get; set; }
2
répondu andreydruz 2012-02-17 21:58:56

dans mon cas, le problème venait du fait que la pièce D'identité était du type string . Passer à un int (non nul) l'a corrigé pour moi. Le type string est le résultat de la rétro-ingénierie d'une base de données mal conçue.

1
répondu PBG 2013-05-08 14:42:28

Vérifiez votre vue. Retirez si vous avez hiddenfieldfor id field. Il est utilisé uniquement pour le montage. @HTML.HiddenFor (Model => Model.Id)

1
répondu Than Aramburo 2016-02-01 05:21:26

je viens de créer un nouveau projet MVC2, et j'ai ajouté un simple POCO ainsi qu'un contrôleur et une vue. D'après ce que j'ai compris, vous utilisez model binding pour créer l'objet, c'est-à-dire

using System.ComponentModel.DataAnnotations;
public class SimpleObject
{
    public int Id {get;set;}
    [Required]
    public string Message { get; set; }
}

dans le contrôleur nous avons

[HttpPost]
public ActionResult Create(SimpleObject created)
{
    /// do something
}

et dans la vue, il n'y a pas d'éditeur pour le champ ID?

cela ne doit pas se retrouver dans des messages d'erreur. Au lieu de cela, L'Id est supposé être défini par défaut(int) qui est 0. Ce fonctionne pour moi. Quelle version de MVC2 utilisez-vous (le RC je suppose)?

ne vous méprenez pas: il est important d'empêcher L'Id d'être lié par les classeurs model car cela permettrait à un attaquant de trafiquer l'Id de l'objet. Néanmoins, le classeur de modèle par défaut ne devrait pas montrer le comportement que vous décrivez.

0
répondu mnemosyn 2010-01-27 07:31:13

j'ai eu le même problème, sauf que j'avais trois champs entiers sur mon modèle. J'ai réussi à le contourner en définissant toutes mes propriétés integer qui étaient requises par erreur pour annuler les ints.

0
répondu kmehta 2010-02-01 14:14:07

les réponses ci-dessus sont correctes. Comment chacun suit un scénario différent .Ma solution est la suivante pour le même problème. Si votre ID est une clé primaire alors vous devez l'initier je veux dire quand vous passez le model pour voir dans la méthode get il suffit de créer un nouvel objet avant lui . Il positionnera 0 à votre ID au lieu de null.

0
répondu Geeti 2015-01-29 05:23:11

j'ai eu le même problème et j'ai réussi à le résoudre en passant simplement une instance vide du modèle de vue à la vue pendant l'appel GET de ma méthode Create.

//GET: DocumentTypes/{Controller}/Create
    public ActionResult Create()
    {
        return View(new DocumentTypeViewModel());
    }

    //POST: DocumentTypes/{Controller}/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(DocumentTypeViewModel viewModel)
    {
        if(ModelState.IsValid) {

            var result = AddDocumentType(viewModel);
            if(!result.HasValidationErrors) {
                return RedirectToAction("Index");
            }

            ModelState.Update(result);

        }

        return View(viewModel);
    }

et puis à mon avis, je m'assure que j'ai

@Html.HiddenFor(m => m.ID)

de cette façon je n'ai pas à spécifier explicitement les attributs Bind

0
répondu jspaey 2015-06-08 17:36:34

j'ai aussi fait face au même problème avec vous et maintenant je l'ai déjà résolu. Avec HttpGet vous devez retourner une vue vide le model. Comme

[HttpGet]
public ActionResult Add()
{
    //Your code here
    return View(new Venue);
}

j'espère qu'il vous sera utile.

0
répondu user3717418 2016-06-08 04:32:39

vous pouvez désactiver cette validation implicite en paramétrant l'option AddImplicitRequiredAttributeForValueTypes sur l'option DataAnnotationsModelValidatorProvider en ajoutant ce qui suit à votre Application_Start :

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

Pour Lire La Suite :

0
répondu KyleMit 2017-12-05 18:38:14