MVC 3 - Html.EditorFor 似乎在 $.ajax 调用后缓存旧值

2023-11-30

这是以下问题的后续:

MVC 3 + $.ajax - 响应似乎正在缓存部分视图的输出

那里有详细的问题描述。但是,我现在已经成功缩小了问题范围,这似乎与 Html.EditorFor 帮助程序有关,因此出现了新问题。

问题:

我使用 $.ajax 将数据发布到服务器,然后返回包含输入控件的部分视图的 html。问题在于,尽管将新创建的对象传递给部分视图模型,各种 @Html.EditorFor 和 @Html.DropDownListFor 帮助程序仍返回旧数据!

我可以通过在 Html 帮助器旁边打印该值来证明模型已正确地将新对象传递给帮助器。 IE:

@Html.EditorFor(model => model.Transaction.TransactionDate) 
@Model.Transaction.TransactionDate.ToString()

如下图所示,@Html.EditorFor 返回错误的数据:

Cached response...

[请注意,Commentario 文本框旁边的值是日期时间,因为我正在测试将默认值替换为随每个帖子而变化的值,即 DateTime。]

如果我将 TransactionDate 的 @Html.EditorFor 替换为普通的旧 @Html.TextBox():

@Html.TextBox("Transaction_TransactionDate", Model.Transaction.TransactionDate)

然后它为新的 Transaction 对象呈现正确的 TransactionDate 值,即 DateTime.MinValue (01/01/0001...)。

所以...

问题出在 @Html.EditorFor 帮助程序上。 TextBoxFor 和 DropDownListFor 也会出现此问题。

问题是这些助手似乎缓存了旧值。

我究竟做错了什么??!

EDIT:

我刚刚尝试在自定义编辑器模板中调试日期,其中 ViewData.TemplateInfo.FormattedModelValue 显示正确的值,即“01/01/0001”。然而,一旦到达 Fiddler,响应就会显示旧日期,例如上图中的“01/09/2011”。

结果,我只是认为这里正在进行一些缓存,但我没有设置任何缓存,所以没有任何意义。


没有caching涉及到这里。这就是 HTML 助手的工作原理。他们在绑定值时首先查看 ModelState,然后在模型中查看。因此,如果您打算修改控制器操作中的任何 POSTed 值,请确保首先将它们从模型状态中删除:

[HttpPost]
public virtual ActionResult AjaxCreate(Transaction transaction)
{
    if (ModelState.IsValid)
    {
        service.InsertOrUpdate(transaction);
        service.Save();
    }
    service.ChosenCostCentreId = transaction.IdCostCentre;
    TransactionViewModel viewModel = new TransactionViewModel();
    ModelState.Remove("Transaction");
    viewModel.Transaction = new Transaction();
    ModelState.Remove("CostCentre");
    viewModel.CostCentre = service.ChosenCostCentre;
    ...

    return PartialView("_Create", viewModel);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVC 3 - Html.EditorFor 似乎在 $.ajax 调用后缓存旧值 的相关文章

随机推荐