MVC3区域如何在页面名称中使用破折号

时间:2012-03-06 15:55:16

标签: asp.net asp.net-mvc-3

我们正在使用带有项目的区域。我们也使用此修补程序替换页面名称中的破折号

 routes.Add(
            new Route("{controller}/{action}/{id}",
                new RouteValueDictionary(
                    new { controller = "Home", action = "Index", id = UrlParameter.Optional }),
                    new HyphenatedRouteHandler())
            );



        public class HyphenatedRouteHandler : MvcRouteHandler
        {
            protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
            {
                requestContext.RouteData.Values["controller"] = requestContext.RouteData.Values["controller"].ToString().Replace("-", "_");
                requestContext.RouteData.Values["action"] = requestContext.RouteData.Values["action"].ToString().Replace("-", "_");
                return base.GetHttpHandler(requestContext);
            }
        }

此修复程序适用于普通的顶级页面。首页/一些页。 但是当涉及到一个区域时,它就不再起作用了。我尝试将AreaRegistration.cs文件修改为与Global.asax.cs路由等效,但这也不起作用。我可以用[ActionName(“some-page”)]重命名页面但是它没有解决控制器仍然有下划线Area / some_folder / some-page的问题,我不希望我的URL看起来像那样。

修改 当我使用Darin Dimitrov建议的路线时,我得到了这个错误:

找到了与名为“page”的控制器匹配的多个类型。如果为此请求提供服务的路由('admin / {controller} / {action} / {id}')未指定名称空间来搜索与请求匹配的控制器,则会发生这种情况。如果是这种情况,请通过调用带有'namespaces'参数的'MapRoute'方法的重载来注册此路由。

我们有多个“细分”,它们具有相同的名称但内容不同,以定位细分受众群

1 个答案:

答案 0 :(得分:3)

以下内容适用于您的区域注册:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.Add(
        "Admin_default",
        new Route("Admin/{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new 
                { 
                    area = AreaName
                }
            ),
            new HyphenatedRouteHandler()
        )
    );
}

更新:

您似乎在多个区域中具有相同的控制器名称,这在注册路由时未定义命名空间约束是不可能的,因为您收到的错误消息建议您这样做。

所以你的Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.Add(
        "Default",
        new Route(
            "{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new { Namespaces = new[] { "AppName.Controllers" } }
            ),
            new HyphenatedRouteHandler()
        )
    );
}

并在您的AreaRegistration中:

public override void RegisterArea(AreaRegistrationContext context)
{
    context.Routes.Add(
        "Admin_default",
        new Route(
            "Admin/{controller}/{action}/{id}",
            new RouteValueDictionary(
                new { action = "Index", id = UrlParameter.Optional }
            ),
            null,
            new RouteValueDictionary(
                new 
                { 
                    Namespaces = new[] { "AppName.Areas.Admin.Controllers" },
                    area = AreaName
                }
            ),
            new HyphenatedRouteHandler()
        )
    );
}

您可能需要调整约束中的命名空间以匹配您的命名空间。