我正在使用jquery弹出叠加层(http://dev.vast.com/jquery-popup-overlay/)来显示Credit操作的内容(如下所示)。
使用下面显示的代码,我希望清除弹出窗口中的字段,因为我使用新创建的模型返回部分视图,但没有设置值;但是这些字段根本没有更新。
疯狂的是,如果我注释掉“返回PartialView(模型);”声明并取消注释“返回Json(”Yay it working!“);”然后弹出窗口被替换为“Yay it working!”。 (是的,当我取消注释该行时,我还必须更改操作的返回类型。)
为什么Ajax.BeginForm在使用Json返回值的文本替换目标div时没有问题,但完全忽略了PartialViewResult的结果?
public PartialViewResult Credit()
{
CreditPaymentModel model = new CreditPaymentModel();
return PartialView(model);
}
[HttpPost, ValidateAntiForgeryToken]
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
public PartialViewResult Credit(CreditPaymentModel model) {
model = new CreditPaymentModel(); // breakpoint here
return PartialView(model);
//return Json("Yay it worked!");
}
编辑:我刚添加了一个处理OnSuccess事件的函数。我可以在处理过程中逐步浏览视图(在提交之后它返回带有空模型的视图)并验证值实际上是null,但是当它到达OnSuccess方法时,它接收的数据显示原始数据提交而不是我期待的空白值。通常我会期望这是由于缓存,但我有一个关于Credit操作的OutputCache属性,我在AjaxOptions中将AllowCache属性设置为false,所以我不明白这是怎么发生的?!
答案 0 :(得分:1)
您在部分视图表单中使用的HtmlHelper
方法使用ModelState
中的值而不是模型中的值(如果存在),在您的情况下它们会执行,因为您的POST方法有一个类型的参数CreditPaymentModel
已将CreditPaymentModel
的每个值添加到ModelState
DefaultModelBinder
。
如果要显示ModelState.Clear;
的默认值,则需要在返回模型之前使用CreditPaymentModel
。有关行为的更详细说明,请参阅TextBoxFor displaying initial value, not the value updated from code。
但请注意,因为您返回了新的部分,所有客户端验证都将丢失,除非您重新解析$.validator
(请参阅this answer示例)。所有这一切都会更容易使用$.ajax()
方法,它提供了更大的灵活性,在您的情况下,方法返回部分ModelState
无效并且您希望显示验证错误,或返回否则null
。在ajax成功回调中,如果结果为null,则只需重置现有表单控件,否则替换partial并重新解析$.validator
。