1

我正在关注 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() 方法的属性名称,但我不确定。任何帮助表示赞赏。

4

1 回答 1

1

首先,当您的模型中有一个类实例属性时,如果它为null,则不会对其任何属性运行验证。其次,您的类实例属性有一个私有设置器,因此模型绑定器将无法实际将其设置为任何内容,这意味着它始终为空。

总而言之,问题在于私人二传手。

于 2017-03-07T17:35:59.983 回答