【问题标题】:On adding jquery unobtrusive ajax script file controllers action runs two times在添加 jquery 不显眼的 ajax 脚本文件控制器操作运行两次
【发布时间】:2014-04-19 10:50:02
【问题描述】:

我想在我的应用程序中添加用户 Ajax.Actionlink 并且为了使这项工作我必须添加

jquery.unobtrusive-ajax.min.js

现在我已经添加了它,发生了一些奇怪的事情。 这是我加载js文件的顺序

   bundles.Add(new ScriptBundle("~/bundles/jquery").Include(
                "~/Scripts/jquery-2.1.0.min.js",
                 "~/Scripts/jquery.unobtrusive-ajax.min.js"));

    bundles.Add(new ScriptBundle("~/bundles/jqueryval").Include(
                "~/Scripts/jquery.validate.min.js",
                "~/Scripts/jquery.validate.unobtrusive.min.js"));

布局页面以我提到的相同顺序加载此 js 文件 所以我的 _layout 页面有

@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")      
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/Scripts/jquery-ui-1.10.4.js")
@Scripts.Render("~/bundles/bootstrap")
@Scripts.Render("~/bundles/Kendo")
@Scripts.Render("~/bundles/toastr")

现在当我从视图提交 ajax 表单时

@using (Ajax.BeginForm("AddAttendeeInternalAddressBook", "Attendee", new AjaxOptions { HttpMethod = "POST", OnSuccess = "doneInternalAddressBook" }))
{
     @Html.AntiForgeryToken()
     @Html.ValidationSummary()

    <div class="form-group">             
        @Html.TextBoxFor(m => m.SelectedAddressBookPerson.Email, new {@class = "form-control", PlaceHolder = "Search in AddressBook..." }) &nbsp; &nbsp;               
        <input type="submit" id="btnAddressBook" class="btn btn-default" value="Add>>">           
    </div>
}

这个控制器的方法运行了两次

public ActionResult AddAttendeeInternalAddressBook(CreateAppointmentSelectPersons internalAddressbookPerson)
{
    bool result = _attendeeRepository.CheckIfAttendeeExists(internalAddressbookPerson.SelectedAddressBookPerson.AppointmentId, internalAddressbookPerson.SelectedAddressBookPerson.Email);
    if (!result)
    {
        _attendeeRepository.AddInternalAddressBookAttendee(
        internalAddressbookPerson.SelectedAddressBookPerson.AppointmentId,
        internalAddressbookPerson.SelectedAddressBookPerson.FirstName,
        internalAddressbookPerson.SelectedAddressBookPerson.LastName,
        internalAddressbookPerson.SelectedAddressBookPerson.Email);
    }

    return Json(new { AttendeeExists = result, ErrorMessage = "Person already exists in your list" });  
}

所以当我在这个动作的第一行放置断点并发布表单时,第一行

bool result = _attendeeRepository.CheckIfAttendeeExists(internalAddressbookPerson.SelectedAddressBookPerson.AppointmentId, internalAddressbookPerson.SelectedAddressBookPerson.Email);

被执行两次。然后 if 语句被执行两次,然后存储库方法被调用两次。

所以基本上所有的行都被执行了两次。这个人被两次添加到我的数据库中。

但是当我删除线时(不加载)

  "~/Scripts/jquery.unobtrusive-ajax.min.js"

一切都很好。 控制器中的动作被执行一次(它应该的方式)。

我也将 UnobtrusiveJavascriptEnabled 设置为 true

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

问题:

谁能解释发生了什么。

为什么我提交 ajax 表单时,控制器的每行操作都会执行两次?

【问题讨论】:

标签: javascript jquery ajax asp.net-mvc


【解决方案1】:

您可能会在您的应用程序中多次添加jquery.unobtrusive-ajax.min.js。这样它可能会运行控制器两次

【讨论】:

  • 甚至没有意识到这一点。感谢您的提醒。是一个很大的帮助。拯救了我的一天!
  • 在 MVC 项目中,这对我来说是正确的答案,我错误地将包包含在布局文件中,然后在特定视图中。我的意思是只包含在需要 ajax 的视图中。谢谢指点。
  • 很好,我也做过同样的事情,因此花了好几天的时间挠头
猜你喜欢
  • 2017-01-22
  • 2015-04-09
  • 2011-10-10
  • 2011-01-31
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
相关资源
最近更新 更多