更改模型后未显示ModelState错误

时间:2017-03-07 17:22:08

标签: c# asp.net asp.net-mvc visual-studio nerddinner

我正在关注Professional ASP.NET MVC 1.0上的NerdDinner示例(我正在使用VisualStudio 2015附带的ASP.NET MVC版本),到目前为止我能解决一些小问题,但是这个一个人来找我。

我有一个名为Dinner的模型,它被传递给一个名为Create()的动作的视图。与Create对应的视图基本上是一个要求提供某些信息的表单,当提交时,页面会显示错误(如果有)。错误通过ModelState对象传递给视图。

    public ActionResult Create()
    {
        Dinner dinner = new Dinner();
        return View(dinner);
    }

    [HttpPost]
    public ActionResult Create(Dinner d)
    {
        TryUpdateModel(d);
        if (d.isValid)
        {
            ...
        }
        else
        {
            foreach (var violation in d.GetRuleViolations())
                ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
            return View(d);
        }
    }

创建视图看起来像这样。

@model NerdDinner.Models.Dinner

...

            @Html.ValidationMessageFor(Model => Model.Title, "", new { @class = "text-danger" })

...

这很好用,直到我创建了一个名为DinnerFormViewModel的新模型,将其他对象传递给Create视图。

public class DinnerFormViewModel
{
    public Dinner Dinner
    {
        get;
        private set;
    }

    public DinnerFormViewModel() : this(new Dinner()) { }

    public DinnerFormViewModel(Dinner d)
    {
        Dinner = d;
    }

    ... stuff ...
}

我更新了Create()方法,以确保将正确的模型传递给相应的视图。

    public ActionResult Create()
    {
        Dinner dinner = new Dinner();
        return View(new DinnerFormViewModel(dinner));   // Updated line.
    }

    [HttpPost]
    public ActionResult Create(DinnerFormViewModel d)   // Updated line.
    {
        TryUpdateModel(d);
        if (d.Dinner.isValid)   // Updated line.
        {
            ...
        }
        else
        {
            foreach (var violation in d.Dinner.GetRuleViolations())   // Updated line.
                ModelState.AddModelError(violation.PropertyName, violation.ErrorMessage);
            return View(new DinnerFormViewModel(d.Dinner));   // Updated line.
        }
    }

同时更新了视图。

@model NerdDinner.Models.DinnerFormViewModel

...

            @Html.ValidationMessageFor(Model => Model.Dinner.Title, "", new { @class = "text-danger" })

...

页面正常运行(正确保存有效表单数据),但是当提交无效信息时,页面上不再显示错误。在视图文件中,我检查了存储在ModelState中的错误,它们都在那里。 ModelState和表单字段之间似乎存在脱节。我认为问题是我提供给ModelState.AddModelError()方法的属性名称,但我不确定。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

首先,如果模型中有类实例属性,如果它是 null ,则不会对其任何属性运行验证。其次,您的类实例属性有一个私有的setter,因此modelbinder将无法将其实际设置为任何东西,这意味着它将始终为null。

长而短,问题是私人制定者。