我有一个使用Entity Framework的ASP.NET MVC 2.0应用程序。我的所有观点都使用视图模型,其中大多数都很复杂。含义...要编辑的对象是视图模型的属性,而不是视图模型本身。
我正在使用带有数据注释的部分类,并在控制器中的POST操作中检查ModelState.IsValid。
我有一个“NEW”表单和一个“EDIT”表单,用于包含3个字段的简单对象!
如果我尝试提交一个空白表单,ModelState.IsValid检查适用于NEW表单,并显示正确的“必填字段”错误。
但是,如果我加载一个EDIT表单,并清除所需的一些文本框中的值,并提交表单,我不会得到验证错误,我只是得到一个例外:
执行处理程序'System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerWrapper'的子请求时出错。
所以我的问题是,ModelState.IsValid是否不适用于EDIT表单,因为它可能正在查看已加载的视图模型对象中的值,而不是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 :(得分:0)
由于MVC的2.0版本我不再使用formcollection。
当我有帖子时,我只在动作的参数中使用viewmodel,如下所示:
[HttpPost]
public ActionResult Activatecard(ActivateCardViewModel model)
{
当'it'无法创建我的模型时(为datetime字段输入blabla,或者当不满足验证时(我使用System.ComponentModel.DataAnnotations
命名空间中的验证属性),我得到{{1}等于假。
我创建了一个空白的asp.net mvc2应用程序,这是用于登录操作的标准模板的模型。
答案 1 :(得分:0)
请删除FromCollection参数。您可以为视图模型使用默认的ModelBinders。 Asp.net MVC尝试将表单中的值映射到模型中。
您能否发布行动方法,这也会引导您进入编辑表单?