【问题标题】:MVC Update HiddenFor in jQuery and submit to controllerjQuery 中的 MVC 更新 HiddenFor 并提交给控制器
【发布时间】:2016-04-10 17:55:40
【问题描述】:

我正在建立一个汽车共享网站,并有一个用于浏览现有旅程的页面。页面顶部是用于搜索位置的搜索栏。我想使用 Google Maps API 来验证地名,然后将其发送到带有坐标的控制器,然后在半径内进行搜索。

在我的一生中,无论我使用什么代码组合,在表单提交给控制器之前,我似乎都无法更新 HiddenFor 或搜索字段。我知道验证地点的代码可以在我在另一个页面上使用它来创建旅程时工作。

所以理论上是用户在 SearchString 文本框中输入一个地名,单击提交按钮,然后运行 ​​jquery 代码,验证该地点,使用地理编码器获取正确的位置,然后更新搜索字符串并坐标隐藏字段,最后发布到控制器。

这是我当前的代码:

@using (Html.BeginForm("BrowseJourney", "Journey", FormMethod.Post, new { id = "searchForm" }))
{    <div class="form-group" style="padding-bottom: 50px;">
        <div class="col-md-2">
            Find by location:
        </div>
        <div class="col-md-3">
            @Html.TextBox("SearchString", null, new { @class = "form-control" , id = "SearchString"})
        </div>
        <div class="col-md-2">
            Distance:
        </div>
        <div class="col-md-1">
            @Html.DropDownList("Distance", null, new { @class = "form-control" })
        </div>
        @Html.HiddenFor(model => model.SearchLatitude, new { id = "SearchLatitude" })
        @Html.HiddenFor(model => model.SearchLongitude, new { id = "SearchLongitude" })
        <div class="col-md-2">
            <input type="submit" value="Search" class="btn btn-default" id="submitButton" />
        </div>
    </div>   

}

还有 javascript:

   <script src="https://maps.googleapis.com/maps/api/js?v=3&key=AIzaSyD4lap4yr45W9ztvRtfNw7JA-d03UVYtx0&region=GB" type="text/javascript"></script>
    <section class="scripts">
      <script type="text/javascript">

        $('#submitButton').click(function() {
          var address = document.getElementById("SearchString").value;
          var geocoder = new google.maps.Geocoder();
          geocoder.geocode({
            'address': address,
            componentRestrictions: {
              country: 'UK'
            }
          }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
              document.getElementById("SearchString").value = results[0].formatted_address;
              document.getElementById("SearchLatitude").value = results[0].geometry.location.lat();
              document.getElementById("SearchLongitude").value = results[0].geometry.location.lng();
            } else {
              alert("Unable to find location");
              document.getElementById("SearchString").value = null;
            }
          });
        });
      </script>
    </section>

最后是控制器:

public ActionResult BrowseJourney(string searchString, int distance, string searchLatitude, string searchLongitude)
{
}

非常感谢任何帮助!

【问题讨论】:

  • 旁注:如果您打算使用 jQuery,请将其用于您的选择器。例如document.getElementById("SearchString") => $("#SearchString") 等 :) 它的大小减半并且更具可读性(恕我直言)
  • 问:您的脚本放在文件中的什么位置?它没有包装在 DOM 就绪处理程序中,因此必须遵循它引用的 HTML。
  • 抱歉,脚本遵循@section 脚本中的 HTML 表单
  • 对于初学者来说,你不应该对表单使用click 处理程序,因为键盘触发的提交不会触发它。使用submit 处理程序。当您使用 Visual Studio 时,将您的脚本放入一个单独的 JS 文件中,然后您可以简单地断点代码并查看发生了什么:)
  • 下面更新了答案。我从记忆中输入了它,并且最初反转了布尔值。现在应该可以工作了:)

标签: javascript jquery asp.net-mvc


【解决方案1】:

它不起作用的原因是您在单击处理程序中添加代码,然后调用异步事件并等待响应。

与此同时,表单已经提交。

您需要停止表单提交并在您恢复值后从代码中提交它。

类似:

bool proceed = false;
$('#searchForm').submit(function(e) {
  if (!proceed) {
    var address = $("#SearchString").val();
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({
      'address': address,
      componentRestrictions: {
        country: 'UK'
      }
    }, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        $("#SearchString").val(results[0].formatted_address);
        $("#SearchLatitude").val(results[0].geometry.location.lat());
        $("#SearchLongitude").val(results[0].geometry.location.lng());
        proceed = true;  // Allow submit to proceed next time
        $('#searchForm').submit();
      } else {
        alert("Unable to find location");
        $("#SearchString").value = null;
      }
    });
  }
  return proceed;
});

注意:请对所有选择器使用 jQuery。更短更容易理解(对于 jQuery 编码器)。 “一分钱……”

【讨论】:

  • 先生,您是明星。这第一次完美无缺。我之前确实有一个 .submit ,但尝试使用 .click 做一些不同的事情。我现在知道将来要坚持使用 .submit,并且还包括延迟提交直到值发布之前的代码。
【解决方案2】:

我在 mvc 5 上遇到了问题,并在下面的问题中回答帮助我解决了问题。 Wait for form.submit() / POST to complete

可以使用 e.preventDefault();防止默认提交。

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多