Ajax调用是第二次提交时双重发布表单

时间:2015-10-30 14:50:10

标签: ajax asp.net-mvc forms

大家好我有问题,我不明白为什么会这样。

由于某种原因,我第二次提交时,我的ajax电话是双重发布

我的观点包含:

 @using (Ajax.BeginForm("Create", "BasketPage", new AjaxOptions
{
    InsertionMode = InsertionMode.Replace,
    UpdateTargetId = "myDiv",

}))
    {
        <textarea id="comment" name="comment"> </textarea> <br />
        <input type="submit" class="btn btn-blue" value="Comment" />
    }

调用的BasketPage控制器操作如下所示:

public PartialViewResult Create(BasketPage currentPage, string comment)
        {          
                Comment newComment = new Comment()
                {
                    Username = User.Identity.Name,
                    Text = HttpUtility.HtmlEncode(comment),
                    PageID = currentPage.PageLink.ID
                };

                commentRepository.Save(newComment);

                var model = new BasketListModel(currentPage)
                                {
                                    CommentsList = commentRepository.GetComments(currentPage.PageLink)
                                };

                return PartialView("_Comment", model);
        }

问题情景:

  1. 我输入一个值,提交表格。一切都按预期工作。
  2. 我再次(因此第二次)输入一个值,提交表格。现在调用Save方法两次 - 这导致该值在DB中保存两次,创建两行具有相同值。
  3. 如果我用常规的@ Html.BeginForm替换Ajax.beginform,则只调用一次Save方法。

    我错过了什么?

2 个答案:

答案 0 :(得分:5)

可能是你将不引人注目的JavaScript库包含在页面中两次。

检查并删除捆绑配置或附带的<script>标记中的所有重复项。

答案 1 :(得分:0)

之前我遇到过这个问题,我有一个部分视图,数据看起来与此类似

<div id="OuterDiv">
        @using (Ajax.BeginForm("ProcessStuff", "Stuff", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "divWrapper" }, new { @class = "form-horizontal", @id = "frmProcess" }))
            {
            <div ="divWrapper">
            <--add some controls --!>
            </div>
            }
<div/>

我的控制器让代码再次返回视图:

[HttpPost]
public ActionResult ProcessStuff(WhateverNamespace.Models model)
{
  //do some processing
 return PartialView("_stuff", model);
}

问题在于它自己,如果仔细观察,我的 UpdateTargetId 在ajax表单内,导致第二篇文章返回部分视图并将Ajax表单放在已经存在的Ajax中形成。这导致从第二个开始的所有请求多次发布。

此处的解决方案是将 UpdateTargetId 更改为位于ajax表单之外的控件,在本例中为“OuterDiv”