我使用jquery弹出覆盖(http://dev.vast.com/jquery-popup-overlay/)来显示Credit的内容(如下所示)。
使用下面所示的代码,我预期弹出窗口中的字段将被清除,因为我返回的部分视图带有一个新创建的模型,没有设置任何值;但是,这些字段根本没有更新。
最疯狂的是,如果我注释掉“返回PartialView(模型)”语句,取消注释"return“( "Yay!”);那么弹出窗口将被替换为“Yay!”。(是的,当取消对该行的注释时,我还必须更改操作的返回类型)。
为什么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事件。我可以在视图被处理时逐步遍历它(在提交之后,它用一个空的模型返回视图),并验证这些值实际上是空的,但是当它到达OnSuccess方法时,它接收到的数据显示了提交的原始数据,而不是我所期望的空白值。通常,我希望这是由于缓存,但是我在Credit上有一个OutputCache属性,并且我已经在AjaxOptions中将AllowCache属性设置为false,所以我不知道这是如何发生的?!
发布于 2017-03-17 06:50:33
在部分视图表单中使用的HtmlHelper
方法使用的是来自ModelState
的值,而不是来自存在的模型的值,这在您的示例中是这样做的,因为POST方法的参数是CreditPaymentModel
类型,CreditPaymentModel
的每个值都是由DefaultModelBinder
添加到ModelState
中的。
如果要显示ModelState.Clear;
的默认值,则需要在返回模型之前使用CreditPaymentModel
。有关该行为的更详细说明,请参阅TextBoxFor displaying initial value, not the value updated from code。
但是请注意,因为您返回了一个新的部分,除非您重新解析$.validator
,否则所有客户端验证都将丢失(有关示例,请参阅this answer )。所有这些都会更容易使用$.ajax()
方法,它提供了更大的灵活性,在您的示例中,方法返回的部分是ModelState
无效的,您希望显示验证错误,或者以其他方式返回null
。在ajax成功回调中,如果结果为null,只需重置现有的表单控件,否则替换部分并重新解析$.validator
。
https://stackoverflow.com/questions/42850063
复制相似问题