0

我想自动单击启用 Ajax 的表单的提交按钮,以便用户不必单击按钮(但可以选择)。

现在,我正在处理第一个边界,即从 Javascript 调用表单,这样至少,一旦我构建了我的计时器,我就会弄清楚这部分。

我已经尝试了很多方法来做到这一点,但没有任何工作。请记住,这是一个 ASP.NET MVC 4 移动应用程序(它使用 jquery.mobile),但我确实禁用了 jquery.mobile ajax,以便我的按钮可以正常工作(创建手动基于 ajax 的表单并更新 div,确实不适用于 jquery.mobile 应用程序,因为它挂钩所有 ajax 表单的提交)。

所以我当前的按钮工作正常,我似乎无法以编程方式触发它。

我有我的表格:

<% using (Ajax.BeginForm("SendLocation", null, new AjaxOptions { InsertionMode = InsertionMode.Replace, UpdateTargetId = "result", HttpMethod = "POST" }, new { @id = "locationForm" }))
   { %>
<ul data-role="listview" data-inset="true">
    <li data-role="list-divider">Navigation</li>
    <li><%: Html.ActionLink("About", "About", "Home")%></li>
    <li><%: Html.ActionLink("Support", "Support", "Home")%></li>
    <li data-role="list-divider">Location</li>
    <%: Html.HiddenFor(model => model.GPSLongitude)%>
    <%: Html.HiddenFor(model => model.GPSLatitude)%>
    <li><input type="submit" id="submitButton" value="Send" /></li>
</ul>
<% } %>

我试图在javascript中做到这一点:

$.ajax({
                type: "POST",
                url: action,
                success: function () {
                    alert('success');
                }
            });

而且我确实得到了通常会触发的服务器代码。但是,DIV 没有更新,而且模型也不是完整的(它存在时所有内部值都为 null,所以我假设是新实例化的)。

我还尝试了不同的方式来触发表单:

        var form = $('#locationForm', $('#myForm'));
        if (form == null) {
            alert('could not find form');
        } else {
            alert('firigin on form');
           form.submit(function (event) { eval($(this).attr("onsubmit")); return false; });
            form.submit();
        }

这也不起作用:

        var f = $('#locationForm', $('#myForm'));
        var action = f.attr("action");
        var data = f.attr("data");
        $.post(action, data, function() { alert('back'); });

这是我在网上找到的所有方法。

他们都没有工作来触发表单并让它像用户自己按下提交按钮一样正常工作。当然,一旦失败,如果我点击提交按钮,它就会完美运行......

4

2 回答 2

1

使用 Chrome 开发者工具,我发现 $.ajax 调用需要有有效数据才能尝试运行。

我在帖子上收到了一个无声的内部 500 错误。但是当然因为 AJAX 它是无声的,并且控制器没有触发,因为它没有通过 IIS。

所以我发现我发送的数据,说它的 JSON,不是,并且 .serialize() 不使用 JSON 格式。我尝试合并 JSON Javascript 库以将对象转换为 JavaScript,但是,这也不起作用,因为数据模型对象(或表单对象)似乎与这些库不兼容。我会在 JavaScript 控制台中遇到错误,并且这些库在尝试时会崩溃。

我决定实际上只是手动传递我想要的对象:

var encoded = '{ GPSLongitude: ' + $('#GPSLongitude', $('#myForm')).val() + ',GPSLatitude: ' + $('#GPSLatitude', $('#myForm')).val() + '}';

它将我想要发送的隐藏字段(GPS LON/LAT)传递给控制器​​,并且模型在控制器调用中是完整的!

现在,对于正在阅读此答案的任何人。应该更新视图的实际 AJAX 更新过程无法正常工作。尽管出于我的目的,我实际上并不需要正确更新视图。尽管返回了部分视图,但特殊的 AJAX 调用似乎破坏了要更新的表单 div 之间的链接。

然而,由于数据被完整地传递给控制器​​,这基本上将我需要的 GPS 数据传递给服务器,这是我的最终目标。

于 2013-06-14T20:27:40.997 回答
0

确保您包含正确的 js 库。你需要。jquery.js,jquery.unobtrusive-ajax.js

确保 web.confg 中的 unobtrusivejavascriptenabled = true

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

请尝试 $('#locationForm').submit();

它会给出错误信息吗?如果您使用的是 ie,您可以使用开发工具查看网络流量以确保没有发送任何内容。

于 2013-06-14T04:05:12.350 回答