【问题标题】:Ajax.BeginForm is not running "OnSuccess" functionAjax.BeginForm 未运行“OnSuccess”功能
【发布时间】:2016-07-15 00:00:08
【问题描述】:

我在尝试使用 MVC Ajax 助手时遇到了一个奇怪的问题。我在 jquery 本身中发布 ajax 帖子没有问题,但我想避免手动获取我的所有表单参数。

症状
而不是我的 OnSuccess 函数在 asp 中运行,而是像这样呈现我的 Json 对象。

这是我的代码的关键 sn-ps。我必须错过一些微不足道的事情。

查看

 @using (Ajax.BeginForm("ParkingRequest", null, new AjaxOptions()
            {
                HttpMethod = "POST",
                OnSuccess = "SaveComplete",
            }, new { @class = "form-horizontal", role = "form" }))
            {  

Javascript

function SaveComplete(result)
    {
        if(result.success == true)
        {
            $("#confirmation-message").fadeIn();
        }
        else
        {
            if(result.reason != "You should only be selecting one date.")
            {
                $("#failure-message").fadeIn();
            }
            else
            {
                //user somehow bypassed javascript and tried to enter multiple dates
                alert(result.reason);
            }

        }
    }  

控制器

 public async Task<JsonResult> ParkingRequest(Models.FormsViewModels.ParkingRequestEditViewModel vm)
 return Json(new
        {
            success = true
        });

【问题讨论】:

    标签: jquery ajax asp.net-mvc


    【解决方案1】:

    我知道这是旧的,但我最近遇到了同样的问题。我假设您现在已经找到了合适的解决方案,但我将把它留在这里,以防其他人遇到类似情况。

    您是如何提交表单的?就我而言,我希望在任何更改时提交表单(在这种情况下,表单只有几个复选框)我的问题是我试图通过 javascript 提交表单,如下所示:

    <input type="checkbox" onchange="this.form.submit();" ... />
    

    无论出于何种原因,如果通过 javascript 触发,unobtrusive-ajax 库似乎不会异步提交表单。但是,如果通过 HTML 提交按钮触发,它异步提交。

    为了在我的用例中解决这个问题,我在表单中添加了一个隐藏的提交按钮,并更改了我的 javascript 以在更改时单击它:

    <input type="checkbox" onchange="document.getElementById('clicker').click()" ... />
    <input id="clicker" type="submit" style="display:none;" />
    

    瞧! AJAX 助手现在实际上是异步提交的。是的,我知道这有点老套,但它对我有用。

    【讨论】:

      【解决方案2】:

      表单实际上是在提交一个非异步 POST 请求。 javascript 没有拦截它。

      检查您是否包含了必要的 jQuery 库并且没有抛出 javascript 错误。

      【讨论】:

      • 我刚刚对库进行了双重检查,一切都肯定存在,没有抛出任何错误。
      • 能否在jquery.unobtrusive-ajax.js 中的文档事件上设置断点,看看发生了什么?
      【解决方案3】:

      你可能缺少包含 jquery.unobtrusive-ajax.js 文件或渲染 jqeryval 试试这个

      <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
      

      在 _Layout.cshtml 中或

      @Scripts.Render("~/bundles/jqueryval")
      

      而Async方法应该是

      public async Task<JsonResult> ParkingRequest(Models.FormsViewModels.ParkingRequestEditViewModel  vm)
          {
              // do stuff here....
              var result = await Task.Run(() =>
              {
                  return Json(new { success = true });
              });
      
              return result;
          }
      

      否则,您将收到警告。 但我建议您只使用 Ajax Jquery 请求。 希望对你有帮助

      【讨论】:

        【解决方案4】:

        确保您已在页面中包含以下脚本:

        <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
        

        并且您在 web.config 中启用了不显眼的 javascript:

        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
        

        这就是使 Ajax.* 助手(如 Ajax.BeginForm)工作的原因。

        【讨论】:

          猜你喜欢
          • 2014-12-09
          • 1970-01-01
          • 1970-01-01
          • 2018-08-03
          • 2011-07-30
          • 2011-11-09
          • 1970-01-01
          • 2018-09-21
          • 1970-01-01
          相关资源
          最近更新 更多