routes.MapRoute 不适用于使用 GET 提交的表单
Posted
技术标签:
【中文标题】routes.MapRoute 不适用于使用 GET 提交的表单【英文标题】:routes.MapRoute not working for a form submitted with GET 【发布时间】:2014-03-16 18:47:08 【问题描述】:我有一个表示事物下拉列表的表单。您选择所需的东西并点击确定按钮。它使用 GET 提交表单,生成的 URL 是:
/Something/IdentificationInformation?jamesID=26
所以我应用了一个路由规则:
routes.MapRoute(
name: null, // "Add James relationship"
url: "James/IdentificationInformation/jamesID",
defaults: new
Controller = "James",
action = "IdentificationInformation"
);
但是这个 url 路由没有被应用?
提交的表单如下所示:
@using (html.BeginForm("IdentificationInformation", "James", FormMethod.Get))
<div class="col-lg-9 col-md-9 col-sm-9 add-margin-top">
@Html.DropDownList("jamesID", new SelectList(Model, "JamesID", "Name"), new id = "JamesDropdownList" )
</div>
<div class="col-lg-3 col-md-3 col-sm-3 add-margin-top">
@Html.ContinueButton("Continue")
</div>
【问题讨论】:
我可以在这个问题中添加什么来帮助获得答案吗?有点奇怪。 您是否有在此之前定义的任何可能首先匹配的路由?此外,在您的 Html.BeginForm() 中,控制器看起来像是 JamesController ... 之前没有路线,没有。那是一个错字,抱歉,感谢您了解这一点。我最终不得不做 2 个控制器,一个从表单获取 POST 请求,然后重定向到另一个返回视图的控制器。好像路由规则对表单提交不起作用? 【参考方案1】:问题是您的路由期望 jamesID
成为 url 路径的一部分,但表单将其作为查询字符串的一部分提交。如果你把你的路线改成这样,它应该匹配:
routes.MapRoute(
name: null, // "Add James relationship"
url: "James/IdentificationInformation",
defaults: new
Controller = "James",
action = "IdentificationInformation"
);
当然,这个路由可能甚至不是必需的,因为它相当于 controller/action 的默认路由。
如果你想变得花哨,你可以定义一个自定义的 QueryStringConstraint 来确保 jamesID 作为路由匹配的一部分在查询字符串中。这是一个 SO 问题,展示了如何做到这一点:
Can my MVC2 app specify route constraints on Query String parameters?
【讨论】:
谢谢...为什么...可惜实施起来很麻烦:)。我目前的解决方案是 2 控制器方法。一个从表单获取 POST 请求,然后重定向到另一个返回视图的控制器方法。一个页面的 2 个请求只是为了一个漂亮的 URL……我想答案是它的解决方法很差。我看看能不能实现你的想法。以上是关于routes.MapRoute 不适用于使用 GET 提交的表单的主要内容,如果未能解决你的问题,请参考以下文章