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

Dee*_*hak 6 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
    );
Run Code Online (Sandbox Code Playgroud)

ActionLink代码

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

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

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

但它正在选择默认路线!

Eil*_*lon 2

在此路由定义中:

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

必须满足以下条件才能匹配路由:

  1. 如果有一个controller参数传入,ActionLink那么它的值必须是Base
  2. Page参数必须指定且必须非空,因为它没有默认值
  3. SubPage参数必须指定且必须非空,因为它没有默认值
  4. DetailPageName参数必须指定且必须非空,因为它没有默认值

所以在这次通话中ActionLink

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

条件#1 显然已得到满足。但条件#2、#3 和#4 可能无法满足,因为它们的值可能为空。

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

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