【问题标题】:Why do return View() - and return View(MyModelName) both pass [invalid] model back to view (MVC 5)为什么返回 View() - 并返回 View(MyModelName) 都将 [invalid] 模型传递回视图(MVC 5)
【发布时间】:2016-09-13 14:39:42
【问题描述】:

我有一个 MVC 5 网站 - 带有一个控制器。如果 ModelState.IsValid - 那么我执行一些操作。

如果它无效,我需要告诉用户错误(在 ViewBag.Message 中) - 并将无效模型传回视图,以便用户查看和编辑它。

所以这在控制器操作结束时起作用:

return View(MyModelName);

但是 - 为什么这也有效?:

return View():

为什么不要求我明确地传回无效模型?即使这样也不会将空白模型传递回视图:

return View(new MyModelName());

我必须执行:

ModelState.Clear();

让一个空白模型进入视图。有人可以向我解释为什么它会这样,这样我就可以理解发生了什么。

我在 Google 上找不到任何相关信息。谢谢。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5


    【解决方案1】:

    因为它首先检查ModelState dictionary 以查看是否存在任何值。如果是,这些将用于呈现表单输入字段的值。

    当您调用ModelState.Clear() 时,它会清除模型状态字典。由于模型状态字典是空的,现在它将回退到传递给视图的模型并使用它。这就是您将能够在视图中看到视图模型的任何更新属性值的原因,如果您在操作方法中更新属性值并返回视图。

    【讨论】:

    • 谢谢。那么是否有任何理由返回 View(MyModelName) - 这是否有效地做同样的事情?是最佳实践吗?
    • 还有为什么 return View(new MyModelName()) 不导致显示一个空白对象?
    • 因为它使用模型状态字典
    • 如果模型状态字典为空,那么只有将模型传递给视图的意义吗?一个不同的填充模型会怎样——它仍然会显示模型状态字典的内容吗?
    • 是的。例如,如果您的视图模型有一个集合属性,您在视图中使用该集合属性来构建 SELECT 元素 (like this example),使用 Html.DropDownListFor 辅助方法,您需要重新加载视图模型的此集合属性值并发送视图模型对象回来。
    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 2020-06-18
    • 1970-01-01
    • 2015-09-02
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多