我正在使用ASP.NET MVC2应用程序。我已经意识到MVC在幕后与模型史密斯和模型绑定有关的一件非常令人惊讶但又令人惊奇的事情。我有一个具有大量数据的ViewModel-有些字段是表单的一部分,而另一些则只是UI的一部分。在HTTPPOST上,我的操作方法使用了试图绑定整个模型的DefaultModelBinder,但仅是表单中一部分的字段才能成功进行序列化 - 所有其他字段均保持无效。很好,可以理解。如果ModelState无效,我需要 刷新 来自DB的模型 绑定 在返回相同的编辑视图之前,这些特定的表单字段以显示那些关联的ModelState验证错误。

这是我的惊奇和好奇心的来源。我的假设是让我 绑定 带有刷新模型的表单字段,我需要打电话给任何一个 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<>(), 刷新模型自动与已发布的表单字段值绑定!!因此, TryUpdateModel<>() 这里不需要!

我唯一可以理解它的方法是,由于ModelState处于无效状态,一旦我使用刷新模型返回视图,“ MVC渲染引擎”通过ModelState错误循环,并将这些属性值与我的刷新限制为模型。真是太棒了!但是,我想证明这一假设。我找不到有关网络任何地方的文档。谁能确认我为什么/为什么这种令人敬畏的自动绑定行为发生和/或教育我为什么/如何发生这种情况的假设,希望能备份一些在线文档链接,以便我更充分地了解封面下的情况?

有帮助吗?

解决方案

public ActionResult EditDetail(EditDetailItemModel model)

该线将执行模型绑定。一如既往地想到ActionMethod参数,并由对UpdateModel的调用填充。

您没有在视图中看到RefreshedModel的值,而是从EdistDetailitemmodel中看到模型状态条目和值。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top