具有多个参数MVC4的多个路由

时间:2013-10-24 23:17:13

标签: c# asp.net-mvc routes

我有一个网页正在使用两个网址参数进行重定向: ID bidId 我还有一个其他网页,其中包含两个其他网址参数的重定向: id templateId

我想创建一个路径,以获得一个格式良好的URL,如:localhost / 12/50,但我的路线有问题。

            routes.MapRoute(
        name: "SubmitBid",
        url: "{controller}/{action}/{id}/{bidId}/",
        defaults: new { controller = "Tender", action = "SubmitBid", id = UrlParameter.Optional, bidId = UrlParameter.Optional });

        routes.MapRoute(
        name: "Tender",
        url: "{controller}/{action}/{id}/{templateId}",
        defaults: new { controller = "Tender", action = "Create", id = UrlParameter.Optional, templateId = UrlParameter.Optional });

当我访问SubmitBid页面时,URL工作正常但如果我转到模板页面,我有一个这样的URL:localhost / 5 /?templateId = 0

我不明白为什么它不起作用,我需要你的帮助来理解它为什么这样做。谢谢您的帮助。卡琳


修改:我导航的方式如下:

@Html.ActionLink(this.LocalResources("Use"), VIA.Enums.ActionName.UseTemplate.GetStringValue(), new { Id = "0", templateId = item.Id })

@using (Html.BeginForm("SubmitBid", "Tender", new { id = Model.Id, bidId = "0" }, FormMethod.Get, null))
{
    <div style="text-align: center; margin: 20px 0 0 0">
        <button class="btn btn-large btn-primary" type="submit">@this.LocalResources("Bid.Text")</button>
    </div>
}

2 个答案:

答案 0 :(得分:6)

您应该为两个控制器操作添加特定路由:

routes.MapRoute(
    name: "SubmitBid",
    url: "Tender/SubmitBid/{id}/{bidId}/",
    defaults: new 
                { 
                    controller = "Tender", 
                    action = "SubmitBid", 
                    id = UrlParameter.Optional, 
                    bidId = UrlParameter.Optional 
                });

routes.MapRoute(
    name: "Tender",
    url: "Tender/Create/{id}/{templateId}",
    defaults: new 
                { 
                    controller = "Tender", 
                    action = "Create", 
                    id = UrlParameter.Optional, 
                    templateId = UrlParameter.Optional 
                });

// Default route, keep this at last for fall-back.
routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new 
                { 
                    controller = "Home", 
                    action = "Index", 
                    id = UrlParameter.Optional 
                });

答案 1 :(得分:1)

我认为这是你的问题:

1)首先,您设置的第二条路线无关紧要。它永远不会被击中或用于基础链接。

2)其次,因此,当您在模板操作链接的路线值中加入templateId时,

 new { Id = "0", templateId = item.Id })

ASP.Net MVC查看了你的路线,找到了第一个满足NUMBER个参数的路线,然后尝试用链路上的路由值解析可选参数。由于ASP.Net MVC的要求对第一个路由(SubmitBid路由)满意,因此找不到名称为templateId的路由值的可选参数。它只有该路线的“Id”和“bidId”。此时,ASP.Net MVC决定将其作为查询字符串粘贴在url上。 (这也解释了为什么“ID”,网址中的5值看起来是正确的。它是该路线上的可选参数。)

如果您在网页上执行“查看源代码”,您会看到该链接是使用该查询字符串构建的。

以下是解决此问题的方法:

由于永远不会使用您的第二条路线,因此请将其删除。更改您的第一个路线以使用更通用的第二个可选参数:

    routes.MapRoute(
    name: "DefaultRoute",
    url: "{controller}/{action}/{id}/{allPurposePrettyId}/",
    defaults: new { controller = "Tender", action = "SubmitBid", id = UrlParameter.Optional, allPurposePrettyId = UrlParameter.Optional });

然后,您的BeginForm声明和ActionLink定义都会在各自的路线值中使用allPurposePrettyId

@Html.ActionLink(this.LocalResources("Use"), VIA.Enums.ActionName.UseTemplate.GetStringValue(), 
new { Id = "0", allPurposePrettyId = item.Id })

@using (Html.BeginForm("SubmitBid", "Tender", 
new { id = Model.Id, allPurposePrettyId = "0" }, FormMethod.Get, null))
{
<div style="text-align: center; margin: 20px 0 0 0">
    <button class="btn btn-large btn-primary" type="submit">@this.LocalResources("Bid.Text")</button>
</div>
}

显然,你应该得到比allPurposePrettyId更好的名字,但你得到了它的要点。请记住,路线上设置的可选参数的名称也是表格和链接转到的动作方法的签名所期望的。