2010-11-29 14 views
0

Ich habe eine ASP.NET MVC 2.0-Anwendung mit Entity Framework. Alle meine Ansichten verwenden meist sehr komplexe Ansichtsmodelle. Bedeutung ... das zu bearbeitende Objekt ist eine Eigenschaft des Ansichtsmodells und nicht das Ansichtsmodell selbst.ModelState.IsValid funktioniert auf einem "neuen" Formular, aber nicht auf einem Formular "bearbeiten"

Ich verwende Teilklassen mit Datenanmerkungen und überprüfen ModelState.IsValid innerhalb der POST-Aktionen in der Steuerung.

Ich habe ein "NEUES" Formular und ein "EDIT" Formular für ein einfaches Objekt mit 3 Feldern!

Die Prüfung ModelState.IsValid funktioniert auf dem NEW-Formular und zeigt die richtigen "erforderlichen Feld" Fehler, wenn ich versuche, ein leeres Formular zu senden.

Aber wenn ich eine EDIT Form laden und löschen Sie die Werte von einigen Textfelder, die erforderlich sind, und senden Sie das Formular, ich habe keine Validierungsfehler bekommen, bekomme ich nur eine Ausnahme:

Fehler beim Ausführen Kind Anfrage Handler 'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerWrapper'.

Also meine Frage ist, funktioniert ModelState.IsValid nicht mit einem EDIT-Formular, da es vielleicht die Werte aus dem View-Modell-Objekt, die geladen wurden, statt der FormCollection?



    // this one does not validate 

     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Edit(int accountStatusKey, AccountStatusEditViewModel model, FormCollection values) 
     { 
      if (ModelState.IsValid) 
      { 
       db.UpdateAccountStatus(accountStatusKey, values); 
       return RedirectToAction("States"); 
      } 
      else 
      { 
       return View("Edit", model); 
      } 
     } 


    // this one does validate 

     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult New(AccountStatusNewViewModel model, FormCollection values) 
     { 
      if (ModelState.IsValid) 
      { 
       db.AddAccountStatus(values); 

       return View("States", new AccountStatusStatesViewModel()); 
      } 
      else 
      { 
       return View("New", model); 
      } 
     } 

    // how I arrive AT the edit form 

     [AcceptVerbs(HttpVerbs.Get)] 
     public ActionResult Edit(int accountStatusKey) 
     { 
      return View("Edit", new AccountStatusEditViewModel(accountStatusKey)); 
     } 

    // and finally, the view model code 

    public class AccountStatusEditViewModel : ViewModelBase 
    { 

     public AccountStatus AccountStatus { get; private set; } 

     public IEnumerable States { get; private set; } 

     public List StatusTypes { get; private set; } 

     public AccountStatusEditViewModel(int accountStatusKey) 
     { 
      AccountStatus = db.GetAccountStatusByKey(accountStatusKey); 
      States = db.GetAllStates(); 

      StatusTypes = new List(); 
      StatusTypes.Add("Primary Status"); 
      StatusTypes.Add("Secondary Status"); 
      StatusTypes.Add("External Status"); 
     } 

     public AccountStatusEditViewModel() 
     { 
     } 

    } 

    // this action method does not work at all either - no db updating, no validation 
    // the page simply redirects to "States" view, which should only happen if the db 
    // was being updated, right? But nothing is changing in the DB, and the validation 
    // never happens. 

     [AcceptVerbs(HttpVerbs.Post)] 
     public ActionResult Edit(AccountStatusEditViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       if (TryUpdateModel(model, "AccountStatus")) 
       { 
        return RedirectToAction("States"); 
       } 
       else 
       { 
        return View("Edit", model); 
       } 
      } 
      else 
      { 
       return View("Edit", model); 
      } 

     } 


+0

Können Sie beide Aktionsmethoden posten? – Mariusz

+0

Code wurde veröffentlicht – Blackcoil

+0

In Ihrem letzten Codebeispiel 'public ActionResult Edit (AccountStatusEditViewModel-Modell)' was schief geht? Das Modell ist gültig und wird korrekt aktualisiert, wenn es in die Statusansicht umgeleitet wird. Führt es auch dazu, wenn Sie erwarten, dass das Modell ungültige Werte enthält? – Michel

Antwort

0

Da die Version 2.0 von MVC Ich bin mehr der Formcollection nicht verwenden.

ich nur das Viewmodel in der Parameter Aktion verwenden, wenn ich einen Beitrag habe, wie folgt aus:

[HttpPost] 
public ActionResult Activatecard(ActivateCardViewModel model) 
{ 

Wenn ‚es‘ kann mein Modell (eingegeben blabla für ein Datetime-Feld nicht schaffen, oder wenn die Validierungen nicht erfüllt ist (i die Validierung verwendet vom System.ComponentModel.DataAnnotations Namespace-Attributen) i die ModelState.IsValid gleich false erhalten.

ich ein leeres asp.net MVC2 App erstellt, und das war das Modell, das die Standard-Vorlage für die Anmeldung verwendet Aktion

+0

Abgesehen davon, dass das Viewmodel für diese Seite komplex ist und das eigentliche Objekt, das ich zu aktualisieren versuche, eine Eigenschaft des Viewmodels ist, nicht das Viewmodel selbst. Ich werde jetzt den Videomodellcode anhängen. – Blackcoil

+0

Erhalten Sie die Exception, wenn Sie nur das Viewmodel hinzufügen, oder validiert es Ihr Modell nur nicht? – Michel

0

Bitte entfernen Sie die FromCollection-Parameter. Sie können die Standard ModelBinders für Ihr Ansichtsmodell verwenden. Asp.net MVC versucht, die Werte aus Ihrem Formular in Ihr Modell zu mappen.

Können Sie bitte die Aktionsmethode posten, die Sie auch zum Bearbeitungsformular führt?

+0

Die GET-Aktionsmethode wurde am Ende des Codeblocks hinzugefügt ... – Blackcoil

+0

Verwenden Sie den Ansatz von Michel, siehe Beitrag oben. Dies sollte für Sie arbeiten. – Mariusz

+0

Ich habe es zu diesem Stil geändert, und es tut immer noch nichts. Die Datenbank wird nicht aktualisiert und die Validierung findet überhaupt nicht statt. Ich werde den Code above beifügen. – Blackcoil

Verwandte Themen