首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Ajax.BeginForm不取代div?

为什么Ajax.BeginForm不取代div?
EN

Stack Overflow用户
提问于 2017-03-17 05:44:52
回答 1查看 179关注 0票数 0

我使用jquery弹出覆盖(http://dev.vast.com/jquery-popup-overlay/)来显示Credit的内容(如下所示)。

使用下面所示的代码,我预期弹出窗口中的字段将被清除,因为我返回的部分视图带有一个新创建的模型,没有设置任何值;但是,这些字段根本没有更新。

最疯狂的是,如果我注释掉“返回PartialView(模型)”语句,取消注释"return“( "Yay!”);那么弹出窗口将被替换为“Yay!”。(是的,当取消对该行的注释时,我还必须更改操作的返回类型)。

为什么Ajax.BeginForm没有问题用Json返回值的文本替换目标div,却完全忽略了PartialViewResult的结果?

代码语言:javascript
运行
复制
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,所以我不知道这是如何发生的?!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42850063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档