Asp.net mvc 为什么我在MVC3控制器内的模型中更新的值没有呈现在客户机上?

Asp.net mvc 为什么我在MVC3控制器内的模型中更新的值没有呈现在客户机上?,asp.net-mvc,asp.net-mvc-3,razor,partial-views,Asp.net Mvc,Asp.net Mvc 3,Razor,Partial Views,我有一个控制器操作UpdateCustomer(CustomerTo customer),它返回一个PartialViewResult,模型也是CustomerTo: [HttpPost] public PartialViewResult UpdateCustomer(CustomerDto customer) { CustomerDto updatedCustomer = _customerService.UpdateCustomer(customer); updatedCus

我有一个控制器操作
UpdateCustomer(CustomerTo customer)
,它返回一个
PartialViewResult
,模型也是
CustomerTo

[HttpPost]
public PartialViewResult UpdateCustomer(CustomerDto customer)
{
    CustomerDto updatedCustomer = _customerService.UpdateCustomer(customer);
    updatedCustomer.Name = "NotThePostedName";
    return PartialView("CustomerData", updatedCustomer);
}
在我看来,我有以下几行:

@Html.TextBoxFor(model => model.Name)
到目前为止,一切顺利。在我看来,我对这个操作方法做了一个异步发布,模型绑定器完成了它的工作,我可以更新数据库中的一个客户。然后我想将更新后的客户呈现给客户机。例如,我想更改控制器中的客户名称。但是,呈现的始终是发布的
客户的属性,而不是
更新的客户的属性

我决定在我的项目中包含MVC3源代码,以了解真正发生了什么。MVC3的一个特性(bug?)似乎是它总是从
ViewData.ModelState
获取值,而不是从
ViewData.Model
获取值

这发生在
System.Web.Mvc.Html.InputExtensions
的第366-367行:

string attemptedValue =
    (string) htmlHelper.GetModelStateValue(fullName, typeof(string));
tagBuilder.MergeAttribute("value",
    attemptedValue ?? ((useViewData)
        ? htmlHelper.EvalString(fullName)
        : valueParameter), isExplicitValue);
如您所见,
attemptedValue
来自
ModelState
。它包含
CustomerDto.Name
的旧值(发布到控制器操作的值)

如果这是一个特性,为什么它会以这种方式工作?有办法解决这个问题吗?我希望,如果我更新我的模型,则会呈现更新,而不是我发布的旧值。

是的,这是一项功能(模型状态总是在实际模型之前检查),您可以清除模型状态,或者只更新您需要的值:

ModelState["Name"].Value = updatedCustomer.Name;

谢谢,这个有用。你知道为什么它是这样建造的吗?我有一个视图,并为其提供了一个模型,但该模型中的属性没有呈现。这似乎很违反直觉。我相信假设是,如果您返回相同的视图以响应POST,您希望用户看到他/她输入的数据。要清除部分视图的视图数据,只需将“additionalViewData”作为空对象传递。这将覆盖局部视图的视图数据。视图数据从父视图继承,除非以这种方式重写。这样可以避免显式设置模型状态。