2012-03-06 55 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

相關問題