6

我是 ASP.NET MVC3 的新手。

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

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

全球.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
    );

动作链接代码

@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" }
    );

但它正在选择默认路线!

4

1 回答 1

2

在此路由定义中:

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

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

  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
    })

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

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

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

于 2013-07-05T02:44:58.333 回答