2012-03-06 57 views
1

我们正在将区域用于项目。而且我们还使用此修补程序替换页面名称中的破折号MVC3区域如何在页面名称中使用破折号

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季米特洛夫建议我得到这个错误路线:

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

我们必须具有相同的名称,但不同内容的多个“段”为目标的段观众

回答

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

UPDATE:

您好像在多个区域中具有相同的控制器名称,这是在不定义名称空间约束时无法实现的注册您的路线作为您收到的错误消息建议您做。

因此,在您的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() 
     ) 
    ); 
} 

您可能需要调整的命名空间的约束,以配合你的。

+0

这就是我重写它的方式,它似乎没有工作。我得到了404。我仍然可以在名称中使用_时进入页面,但是 - 版本给了我404。 – ddilsaver 2012-03-06 16:13:39

+0

其实我得到一个错误。我正在编辑帖子,以便您可以看到它。 – ddilsaver 2012-03-06 16:17:51

+0

@ddilsaver,它看起来你有多个区域定义相同的控制器。您将需要使用命名空间约束来解决这些冲突。我已更新我的帖子,以说明如何实现这一目标。 – 2012-03-06 16:46:35

相关问题