为什么 Ajax.BeginForm 不会替换 div?
Why won't Ajax.BeginForm replace div?
我正在使用 jquery 弹出窗口叠加层 (http://dev.vast.com/jquery-popup-overlay/) 来显示 Credit 操作的内容(如下所示)。
使用下面显示的代码,我希望弹出窗口中的字段被清除,因为我return使用未设置任何值的新创建模型查看部分视图;但是这些字段根本没有更新。
疯狂的是,如果我注释掉 "return PartialView(model);" 语句并取消注释 "return Json(" 是的,它起作用了!");"然后弹出窗口被替换为 "Yay it worked!"。 (是的,当我取消注释该行时,我还必须更改操作的 return 类型)。
为什么 Ajax.BeginForm 用 Json return 值的文本替换目标 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 事件。我可以在处理视图时逐步浏览视图(提交后,它 return 是一个空模型的视图)并验证这些值实际上是否为空,但是当它到达 OnSuccess 方法时,它接收到的数据显示提交的原始数据而不是我期望的空白值。通常我希望这是由于缓存,但我在 Credit 操作上有一个 OutputCache 属性,并且我在 AjaxOptions 中将 AllowCache 属性 设置为 false 所以我不明白这是怎么发生的?!
您在部分视图表单中使用的 HtmlHelper
方法使用来自 ModelState
的值,而不是来自您的模型(如果它们存在),在您的情况下,它们这样做是因为您的 POST 方法有一个类型为 CreditPaymentModel
的参数,CreditPaymentModel
的每个值都已被 DefaultModelBinder
添加到 ModelState
。
如果要显示 CreditPaymentModel
的默认值,则需要在 return 模型之前使用 ModelState.Clear;
。有关此行为的更详细说明,请参阅 TextBoxFor displaying initial value, not the value updated from code.
但是请注意,因为您 return 正在创建一个新的部分,所有客户端验证都将丢失,除非您重新解析 $.validator
(请参阅 以获取示例)。所有这一切都会更容易,因为你使用 $.ajax()
方法,它提供了更大的灵活性,在你的情况下,有方法 returns 部分是 ModelState
是无效的,你想显示验证错误,否则 return null
。 ajax成功回调中,如果结果为null,只重置已有的表单控件,否则替换部分重新解析$.validator
.
我正在使用 jquery 弹出窗口叠加层 (http://dev.vast.com/jquery-popup-overlay/) 来显示 Credit 操作的内容(如下所示)。
使用下面显示的代码,我希望弹出窗口中的字段被清除,因为我return使用未设置任何值的新创建模型查看部分视图;但是这些字段根本没有更新。
疯狂的是,如果我注释掉 "return PartialView(model);" 语句并取消注释 "return Json(" 是的,它起作用了!");"然后弹出窗口被替换为 "Yay it worked!"。 (是的,当我取消注释该行时,我还必须更改操作的 return 类型)。
为什么 Ajax.BeginForm 用 Json return 值的文本替换目标 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 事件。我可以在处理视图时逐步浏览视图(提交后,它 return 是一个空模型的视图)并验证这些值实际上是否为空,但是当它到达 OnSuccess 方法时,它接收到的数据显示提交的原始数据而不是我期望的空白值。通常我希望这是由于缓存,但我在 Credit 操作上有一个 OutputCache 属性,并且我在 AjaxOptions 中将 AllowCache 属性 设置为 false 所以我不明白这是怎么发生的?!
您在部分视图表单中使用的 HtmlHelper
方法使用来自 ModelState
的值,而不是来自您的模型(如果它们存在),在您的情况下,它们这样做是因为您的 POST 方法有一个类型为 CreditPaymentModel
的参数,CreditPaymentModel
的每个值都已被 DefaultModelBinder
添加到 ModelState
。
如果要显示 CreditPaymentModel
的默认值,则需要在 return 模型之前使用 ModelState.Clear;
。有关此行为的更详细说明,请参阅 TextBoxFor displaying initial value, not the value updated from code.
但是请注意,因为您 return 正在创建一个新的部分,所有客户端验证都将丢失,除非您重新解析 $.validator
(请参阅 $.ajax()
方法,它提供了更大的灵活性,在你的情况下,有方法 returns 部分是 ModelState
是无效的,你想显示验证错误,否则 return null
。 ajax成功回调中,如果结果为null,只重置已有的表单控件,否则替换部分重新解析$.validator
.