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

Asp.net MVC3区域如何在页面名称中使用破折号,asp.net,asp.net-mvc-3,Asp.net,Asp.net Mvc 3,我们在项目中使用区域。我们还使用此修复程序替换页面名称中的破折号 routes.Add( new Route("{controller}/{action}/{id}", new RouteValueDictionary( new { controller = "Home", action = "Index", id = UrlParameter.Optional }),

我们在项目中使用区域。我们还使用此修复程序替换页面名称中的破折号

 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”)]重命名页面,但这并不能解决控制器仍然有下划线区域/some_文件夹/some page的问题,我不希望我的URL看起来像这样

编辑: 当我使用Darin Dimitrov建议的路线时,会出现以下错误:

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


我们有多个名称相同但内容不同的“细分市场”,以细分市场受众为目标

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

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

更新:

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

因此,在您的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()
        )
    );
}
在您的注册区域:

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

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

我就是这样重写的,但它似乎不起作用。我有一个404。在名称中使用u时,我仍然可以访问该页面,但是-版本给了我404。实际上,我得到了一个错误。我正在编辑这篇文章,以便您能看到它。@DdlSaver,看起来您在多个区域中定义了相同的控制器。您需要使用名称空间约束来解决这些冲突。我已经更新了我的帖子来说明如何实现这一点。它现在忽略了区域,并在根视图文件夹中查找我的“区域”文件夹。示例~/Views/segment/Index是它所做的,而不是~/Area/segment/index@ddilsaver,事实上,在区域注册中注册路线时,我错过了一个非常重要的细节。
区域
数据令牌。我已经更新了我的帖子来解决这个问题。现在应该可以工作了。