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);
}
}
Können Sie beide Aktionsmethoden posten? – Mariusz
Code wurde veröffentlicht – Blackcoil
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