gpt4 book ai didi

asp.net-mvc - 当 ModelState 在 HttpPost 上无效时,ASP.NET MVC 自动绑定(bind)刷新的模型

转载 作者:行者123 更新时间:2023-12-01 06:46:56 25 4
gpt4 key购买 nike

我正在开发一个 ASP.NET MVC2 应用程序。我开始意识到 MVC 在幕后所做的与 ModelState 和模型绑定(bind)有关的一件非常令人惊讶但又令人惊奇的事情。我有一个 ViewModel,它有一大堆数据——一些字段是表单的一部分,而其他字段只是 UI 的一部分。在 HttpPost 上,我的 Action 方法使用 DefaultModelBinder 尝试绑定(bind)整个模型,但只有作为表单一部分的字段被成功反序列化 - 所有其他字段都保持为空。这很好,可以理解。如果 ModelState 无效,我需要从数据库刷新模型并绑定(bind)那些特定的表单字段,然后再返回到相同的编辑 View 以显示那些关联的 ModelState 验证错误。

这就是我惊奇和好奇的地方。我的假设是为了让我将表单字段与刷新的模型绑定(bind),我需要调用 UpdateModel()TryUpdateModel<>() ,传入新刷新的模型。例如:

[HttpPost]
public ActionResult EditDetail(EditDetailItemModel model)
{
if (model.IsValid)
{
// Save the results to the db

return RedirectToAction(...)
}

// Can't simply "return View(model)". Not all fields in EditDetailItemModel
// were part of the form - thus they returned null. Have to refresh
// model from the db.

var refreshedModel = RefreshModelFromDB();

// Is this line necessary?????
TryUpdateModel<EditDetailItemModel>(refreshedModel);

return View(refreshedModel);
}

但是,我发现如果我只是返回 refreshedModel无需调用 TryUpdateModel<>() 即可查看 View ,刷新后的模型会自动绑定(bind)表单字段值!!因此, TryUpdateModel<>()这里不需要!

我能理解它的唯一方法是,由于 ModelState 处于无效状态,一旦我返回带有刷新模型的 View ,“MVC 渲染引擎”循环遍历 ModelState 错误并将这些属性值与我刷新的绑定(bind)模型。这简直太棒了!但是,我想要证明这个假设。我在网络上的任何地方都找不到有关此的文档。任何人都可以确认我的假设为什么/如何发生这种令人敬畏的自动绑定(bind)行为和/或教育我为什么/如何发生,希望有一些在线文档链接支持,以便我更全面地了解幕后发生的事情?

最佳答案

public ActionResult EditDetail(EditDetailItemModel model)

该行将执行模型绑定(bind)。将 ActionMethod 参数视为始终通过调用 UpdateModel 来填充。

您在 View 中看不到 refreshedModel 的值,您看到的是来自 EditDetailItemModel 的 ModelState 条目和值。

关于asp.net-mvc - 当 ModelState 在 HttpPost 上无效时,ASP.NET MVC 自动绑定(bind)刷新的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4075673/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com