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)
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)
| 归档时间: |
|
| 查看次数: |
18189 次 |
| 最近记录: |