C#MVC在通过JavaScript动态添加表单动作时没有调用正确的动作方法

时间:2018-04-02 06:43:29

标签: javascript c# asp.net-mvc

首先,如果这看起来很愚蠢,请原谅我,但我无法解决这个问题。

我有一个具有以下结构的MVC页面(不使用HTML.BeginForm):

<form id="frmMiniSearch" method="post">
   ... search controls are here ...
   <%: Html.DropDownListFor(model => model.VehicleCondition, Model.Condition, new {@class = "form-control",@required="true"}) %>
   <input type="submit" value="Search" />
</form>

<script type="text/javascript">
   jQuery(document).ready(function(){
     $("#VehicleCondition").bind("change", function(){
        $("#frmMiniSearch").attr("action", "/quick-search/used/honda/civic/1968-2018")
     });
   });
</script>

执行上述JavaScript后,我可以看到表单(frmMiniSearch)操作更改为/quick-search/used/honda/civic/1968-2018。但是,当我点击Submit按钮,而不是调用正确的操作方法时,它会调用其他方法。

以上网址格式在我的RouteConfig.cs文件中设置:

routes.MapRoute(
   name: "VehicleMiniSearchResult",
   url: "quick-search/{cond}/{makeSlug}/{model}/{yearRange}",
   defaults: new { controller = "SearchResult", action = "VehicleQuickSearch", id = UrlParameter.Optional }
);

我也试过这个:

$(document).ready(function(){
   $("submit").click(function( e ) {
     e.preventDefault();
     $("#frmMiniSearch").submit();
   });
});

结果是一样的。仍在呼唤错误的方法。

我做错了什么?任何建议都会挽救我的生命。

注意:如果我想使用Html.BeginForm来调用正确的方法,我该如何使用路由模式(即quick-search/used/honda/civic/1968-2018)来调用它?类似的东西:

<% using(Html.BeginForm, "Action", "Controller", <something here?>) {} %>

我尝试了Html.BeginRouteForm,但这似乎也没有用。

感谢您的建议。

编辑:

以下是RouteConfig.cs中出现的路径

routes.MapRoute(
  name: "VehicleSearchResult",
  url: "vehicles/search/",
  defaults: new { controller = "SearchResult", action = "Index", id = UrlParameter.Optional }
);

routes.MapRoute(
  name: "VehicleMiniSearchResult",
  url: "quick-search/{cond}/{makeSlug}/{model}/{yearRange}",
  defaults: new { controller = "SearchResult", action = "VehicleQuickSearch", id = UrlParameter.Optional }
);

据我所知,在Orchard CMS中我们需要记住路由顺序,但对于纯MVC应用程序也是如此吗?

顺便说一下,当我直接在浏览器中输入URL时,路由(quick-search/used/honda/civic/1968-2018)有效,我得到了想要的结果。然后它没有调用另一种方法。只有在我尝试通过JS提交表单时才会发生。

1 个答案:

答案 0 :(得分:0)

这不是准确的解决方案,只是一个建议。

为什么不能使用静态操作并在查询字符串或正文中传递参数? 通过这种方式,你可以避免动态的uris。

或从javascript函数调用uri

$(document).ready(function(){
   $("submit").click(function( e ) {
      e.preventDefault();
      //$("#frmMiniSearch").submit();
      //Call your uri here like window.location="";

   });
});