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

awr*_*ley 42 jquery html-helper asp.net-mvc-3

这是以下问题的后续内容:

MVC 3 + $ .ajax - 响应似乎是从部分视图缓存输出

那里有问题的详细描述.但是,我现在已经设法缩小了问题,这似乎与Html.EditorFor助手有关,因此是新问题.

问题:

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

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

@Html.EditorFor(model => model.Transaction.TransactionDate) 
@Model.Transaction.TransactionDate.ToString()
Run Code Online (Sandbox Code Playgroud)

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

缓存响应...

[请注意,Comentario文本框旁边的值是一个日期时间,因为我正在测试用每个帖子改变的值替换默认值,即DateTime.

如果我用一个普通的旧版@Html.TextBox()替换@Html.EditorFor for TransactionDate:

@Html.TextBox("Transaction_TransactionDate", Model.Transaction.TransactionDate)
Run Code Online (Sandbox Code Playgroud)

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

因此...

问题出在@ Html.EditorFor助手上.TextBoxFor和DropDownListFor也会出现问题.

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

我究竟做错了什么??!

编辑:

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

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

Dar*_*rov 103

这里没有涉及缓存.这就是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);
}
Run Code Online (Sandbox Code Playgroud)

  • 达林,但为什么它会看到ModelState?如果我使用我设置的值定义模型,那么我希望类型化视图使用模型I传递并仅使用它.乳清为什么这样做?是什么原因?现在我总是要做这个ModelState.Clear(); 返回视图(模型); 这是一个安全问题.如果我没有清楚ModelState黑客可以通过GET参数修改我的视图. (3认同)

cou*_*ben 19

即使您没有指定缓存,有时也会发生缓存.对于处理AJAX和JSON请求的控制器,我按如下方式装饰它们:

[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
Run Code Online (Sandbox Code Playgroud)

这特别声明不应该发生缓存.

UPDATE

基于答案达林季米特洛夫给了这里,尝试添加下面一行到你的控制器动作:

ModelState.Clear();
Run Code Online (Sandbox Code Playgroud)