2012-03-06 3 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の下線が付いている問題は解決しません。

編集: 私はダーリンディミトロフというルートを使用し、私はこのエラーを取得する提案:

複数のタイプが「ページ」という名前のコントローラーと一致していることが分かりました。これは、このリクエストを処理するルート( '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の中のSO

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

+0

実際にはエラーが発生します。私はあなたがそれを見ることができるように投稿を編集しています。 – ddilsaver

+0

@ddilsaverでは、複数の領域で同じコントローラーが定義されているように見えます。これらの競合を解決するには、名前空間の制約を使用する必要があります。私はこれを達成する方法を説明するために投稿を更新しました。 –