为什么Ajax.BeginForm不会替换div?

时间:2017-03-17 05:44:52

标签: asp.net model-view-controller asp.net-ajax

我正在使用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,所以我不明白这是怎么发生的?!

1 个答案:

答案 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