ModelState.IsValid适用于“新”表单,但不适用于“编辑”表单

时间:2010-11-29 19:37:59

标签: entity-framework asp.net-mvc-2 entity-framework-4

我有一个使用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);
            }

        }


2 个答案:

答案 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尝试将表单中的值映射到模型中。

您能否发布行动方法,这也会引导您进入编辑表单?