2010-11-16 5 views
0

J'ai un modèle assez complexe que j'utilise pour rendre un formulaire et effectuer une validation en utilisant les méta-informations du méta-information du modèle.Pourquoi une erreur ModelState a été ajoutée plus d'une fois sur mon site ASP.NET MVC?

Le modèle View possède une liste d'objets enfants inclus dans le formulaire. les objets enfants sont basés sur ce point:

[Table] 
public class FieldInstance 
{ 
    [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
    public long fiID { get; set; } 
    [Column] 
    public string fiLabel { get; set; } 
    [Column] 
    public bool fiIsRequired { get; set; } 

    [DisplayName("alpha-numeric value")] 
    [Column] 
    public string fiStrValue { get; set; } 

    [DisplayName("date/time value")] 
    [Column] 
    public DateTime? fiDateTimeValue { get; set; } 

    [DisplayName("integer value")] 
    [Column] 
    public long? fiIntValue { get; set; } 

    [DisplayName("decimal value")] 
    [Column] 
    public decimal? fiDecValue { get; set; } 
    [Column] 
    public int fiOrder { get; set; } 
    [Column] 
    public long fiStreamEntryID { get; set; } // FK 
    [Column] 
    public long fiFieldTypeID { get; set; } // FK 

    // Relationship (many FieldInstances to one StreamEntry) 
    // using EntityRef<StreamEntry> and ThisKey 
    // which is "This" table's FK 
    private EntityRef<StreamEntry> _StreamEntry; 
    [System.Data.Linq.Mapping.Association(Storage = "_StreamEntry", ThisKey = "fiStreamEntryID")] 
    public StreamEntry StreamEntry 
    { 
     get { return this._StreamEntry.Entity; } 
     set { this._StreamEntry.Entity = value; } 
    } 

    // Relationship (one FieldInstance to one FieldType) 
    // using EntityRef<FieldTypes> and ThisKey 
    private EntityRef<FieldTypes> _FieldType; 
    [System.Data.Linq.Mapping.Association(Storage = "_FieldType", ThisKey = "fiFieldTypeID")] 
    public FieldTypes FieldTypes 
    { 
     get { return this._FieldType.Entity; } 
     set { this._FieldType.Entity = value; } 
    } 

J'utilise une déclaration Html.EditorFor() pour rendre le modèle de vue partielle pour chaque élément de la liste.

Si je mets du texte dans un champ Datetime, puis Html.ValidationSummary() montre:

•The value 'asd' is not valid for date/time value. 
•The value 'asd' is not valid for date/time value. 

Mon problème est que les erreurs sont ajoutées à la ModelState deux fois au lieu d'une seule fois. Ceci est l'action du contrôleur:

[HttpPost] 
    public ActionResult EntryEdit(StreamEntry form) 
    { 
     // Get values 
     StreamEntry entry = 
      form.seID == 0 
      ? new StreamEntry() 
      : genesisRepository.GetEntryByID(form.seID); 

     // Get Stream for new entry 
     if (form.seID == 0) 
      entry.Stream = genesisRepository.GetStreamByID(form.StreamID); 

     //Validate 
     TryUpdateModel(entry); 

     if (ModelState.IsValid) 
      return RedirectToAction("EntryList", new { id = entry.StreamID }); 
     else 
      return View(entry); 
    } 

Pourquoi des erreurs qui sont déclenchées par la présence d'une entrée incorrecte résultant en deux cas de l'erreur étant ajouté à la `ModelState?

Répondre

2

Ils sont ajoutés une fois par le liant modèle par défaut quand il tente d'analyser l'argument d'action StreamEntry form et une deuxième fois lorsque vous appelez la méthode TryUpdateModel sur le même type (StreamEntry). Donc utilisez les arguments d'action ou la méthode TryUpdateModel mais jamais les deux. Personnellement, j'utilise toujours les paramètres d'action et jamais la méthode TryUpdateModel.

Donc, pour corriger l'erreur dans votre cas:

[HttpPost] 
public ActionResult EntryEdit(StreamEntry model) 
{ 
    if (!ModelState.IsValid) 
    { 
     // the model was not valid => redisplay the form so that 
     // the user can fix errors 
     return View(model); 
    } 
    // Remark: might need to load the model's corresponding stream 
    // from the repository if its values weren't posted 

    // the model was valid => update it in the database 
    genesisRepository.Update(model); 
    return RedirectToAction("EntryList", new { id = model.StreamID }); 
} 
+0

Merci pour cette réponse détaillée. Je vais jouer avec ça. – quakkels

+0

Ouais! Merci pour cette solution! – quakkels

Questions connexes