拾取错误的路由并且ActionLink生成错误的超链接

时间:2012-05-17 10:17:46

标签: asp.net-mvc-routing

我是ASP.NET MVC3的新手。

我在Global.asax中配置了一些路由,我使用@ Html.ActionLink帮助方法生成一些超链接。

除了以下代码中的顶部链接外,所有链接都已正确呈现:

Global.asax中

routes.MapRoute(
    null,
    "Section/{Page}/{SubPage}/{DetailPageName}",
    new { controller = "Base" }
    );

routes.MapRoute(
    null,
    "Section/{Page}/{SubPage}",
    new { controller = "Base", action = "SubPage" }
    );

routes.MapRoute(
    null,
    "Section/{Page}",
    new { controller ="Base", action="LandingPage"}
    );

routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}", // URL with parameters
    new { controller = "Base", action = "Index" } // Parameter defaults
    );

ActionLink代码

@Html.ActionLink(@subPages.LinkedPageName, "DetailPage",
    new {
        Controller = "Base",
        Page = @ViewBag.PageName,
        SubPage = @Model.SubPageName,
        DetailPageName = subPages.LinkedPageName
    })

以上应选择最佳路线,即:

routes.MapRoute(
    null,
    "Section/{Page}/{SubPage}/{DetailPageName}",
    new { controller = "Base" }
    );

但它正在选择默认路线!

1 个答案:

答案 0 :(得分:2)

在此路线定义中:

routes.MapRoute(
    null,
    "Section/{Page}/{SubPage}/{DetailPageName}",
    new { controller = "Base" }
    );

为了匹配路线,必须满足以下条件:

  1. 如果controller参数传递到ActionLink,则其值必须为Base
  2. 必须指定Page参数,且必须为非空,因为它没有默认值
  3. 必须指定SubPage参数,且必须为非空,因为它没有默认值
  4. 必须指定DetailPageName参数,且必须为非空,因为它没有默认值
  5. 所以在这次ActionLink的调用中:

    @Html.ActionLink(@subPages.LinkedPageName, "DetailPage",
        new {
            Controller = "Base",
            Page = @ViewBag.PageName,
            SubPage = @Model.SubPageName,
            DetailPageName = subPages.LinkedPageName
        })
    

    条件#1显然是令人满意的。但条件#2,#3和#4可能不满足,因为它们的值可能为空。

    并且因为您声明最终匹配的路由是默认路由,我怀疑Page参数为null或为空。也就是说,@ViewBag.PageName返回null或空值。

    签入您的代码(可能在调试器中或在视图中打印出来)以查看PageName属性是否有值。