ASP.NET MVC 3区域路由故障排除

时间:2011-09-12 04:05:45

标签: asp.net-mvc routing asp.net-mvc-areas

我的区域注册为:

public override void RegisterArea(AreaRegistrationContext context) {
    context.MapRoute("CPanel_default",
        "CPanel/{controller}/{action}/{id}/{*urlData}",
        new { id = UrlParameter.Optional, urlData = UrlParameter.Optional });
}

此路线旨在填写许多网址:

  • /的cPanel /家/索引
  • /的cPanel /实体/编辑/ 20
  • /的cPanel /实体/编辑/ 20 / abitrary-URL数据

Haack的路由调试器向我展示了该路由正在以此身份运行。但是,我的生成动作链接的代码最近已经破裂,我无法找到休息的原因。

使用以下代码生成操作链接:

public static MvcHtmlString CpanelLink(this HtmlHelper @this, string linkText, 
    string actionName, string controllerName, string areaName = "CPanel") {

    return @this.ActionLink(linkText, 
        actionName, new { controller = controllerName, area = areaName });
}

据我所知,应该考虑区域路线中的所有必填字段。调试显示CpanelLink正在返回<a href="">...</a>,这是一个无任何链接。

修改

其他疑难解答显示路由参数{* urlData}正在杀死Html.CpanelLink。减少到“CPanel / {controller} / {id}”的路由会清除问题,但会破坏依赖于urlData参数的URL。

1 个答案:

答案 0 :(得分:2)

问题是您无法将控制器名称作为路由参数传递。

您需要使用以下ActionLink()方法签名

return @this.ActionLink(linkText, actionName, controllerName, new { area = areaName }, null);

请注意,最后一个参数值为'null',表示html属性。

<强>更新

另一个问题是连续的可选参数,如Phil Haack的blog post

中所述

所以你需要做这样的解决方法;

 context.MapRoute(
                "Route_withUrl",
                "CPanel/{controller}/{action}/{id}/{urlData}",
                new { controller = "Home", action = "Index" }
            );

            context.MapRoute(
                "Cpanel_default",
                "CPanel/{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional}
            );
相关问题