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 提交的表单的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC MapRoute超过1个参数问题

3.路游

路由到同名但参数不同的动作

路由学习2

为啥 asp-route 和 asp-action 互斥?

asp.net webform:RegisterClientScriptBlock 不适用于 jquery