2013-12-09 11 views
41

シナリオ:ASP.NET MVC 5サイトにFormsエリアがあります。アトリビュートルーティングがエリア内で動作しない

新しい属性ルーティング機能を使用して定義されたカスタムルートを使用する詳細アクションにリダイレクトしようとしています。

RedirectToAction:

return RedirectToAction("Details", new { slug }); 

私はにリダイレクトしていますアクション:

[HttpGet] 
[Route("forms/{slug}")] 
public ActionResult Details(string slug) 
{ 
    var form = FormRepository.Get(slug); 

    ... 

    return View(model); 
} 

私はhttp://localhost/forms/my-slugへのリダイレクトを期待するが、代わりにアプリがhttp://localhost/Forms/Details?slug=my-slugに私をリダイレクトしています。

これは、属性ルーティングが機能していないことを意味します。

どうすれば解決できますか?

routes.MapMvcAttributeRoutes()を追加しました。私RouteConfigへのライン:

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

     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

そして、ここに私のApplication_Start(だ):

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

答えて

77

あなたはおそらくルーティング属性で規則ベースのルーティングを組み合わせている、とあなたは属性ルートをマップした後、あなたがあなたのエリアを登録する必要があります

ライン

AreaRegistration.RegisterAllAreas(); 

は、この行の後に呼び出されなければなりません。

routes.MapMvcAttributeRoutes(); 

http://blogs.msdn.com/b/webdev/archive/2013/10/17/attribute-routing-in-asp-net-mvc-5.aspx#route-areasから)説明:

あなたはルート属性で両方の領域を使用している場合は、 (AreaRegistrationクラスで設定された)慣習に基づいたルートを持つエリアであれば、エリアレジストリMVC属性ルートが設定された後で、デフォルトのコンベンションベースのルートが設定される前に発生します。その理由は、一般的な(エリア登録)からミスジェネリック(デフォルトルート)へのルート登録は、到着するリクエストをあまりにも早い時期に一致させることによってより特定のルートを「隠す」ことを避けるためですパイプライン。

あなたは空白のasp.net MVCのウェブサイトを作成し、エリアを追加して、ルーティング属性を使用してVisual Studioを起動中に「エリアを追加」アクションを前に、RegisterAllAreasがあなたのApplication_Startに呼び出す追加されるため、この問題が発生しますルート設定..

代替ソリューション

は、おそらくあなたは、ルーティング属性規則ベースのルーティングを使用し続けるとのみ使用することを好むするつもりはありません。 この場合、FormsAreaRegistration.csファイルを削除するだけで済みます。

+1

SWEET! MVC 5.1以降のこの愚かな変更を把握しようとすると、ほぼ4時間を費やした後、あなたの解決策は問題を一度に解決します。 – Korayem

+0

私の質問+回答が時間の経過とともに非常に多くの人々を助けてくれてうれしく思っています:-) –

+2

これは私のために働いています。私はエリアルート属性を放棄しました。しかし、routes.MapMvcAttributeRoutes()の後にAreaRegistration.RegisterAllAreas()を移動した後、それは魔法のようにトリックをしました! –

34

AreaRegistration.RegisterAllAreas()をRouteConfig.csに移動するだけでは十分ではありませんでした。私もRouteAreaのattibuteためAreaPrefixパラメータを使用するために必要な:

//Use the named parameter "AreaPrefix" 
[RouteArea("AreaName", AreaPrefix = "area-name-in-url")] 
[RoutePrefix("controller-name-in-url")] 
public class SampleController : Controller 
{ 
    [Route("{actionParameter}")] 
    public ActionResult Index(string actionParameter) 
    { 
     return View(); 
    } 
} 

編集:いくつかの時点で、私はうまくルーティング属性処理する方法を示したMicrosoftの試料溶液に出くわしました。またSelectListinput[type="radio"]の配列に変換する方法と、input[type="checkbox"]の配列(同じことを思い出してください)で同じことを行う方法の良い例がいくつか示されています。このサンプル解決策はおそらく、この質問に対する良い答えであり、ラジオボタンとチェックボックスの項目を表示する良い例があります。このサンプル・ソリューションを誰かが知っているなら、それにリンクしたコメントを追加してください。

+0

これがなければ、ビューエンジンは自分のビューの場所を正しく推測することができました。 –

+3

AreaPrefix = ""(.NET 4.6.1アプリ、同じ名前の他のエリア/フォルダがないのであいまいさがない)でも、AreaPrefixが必要でした。 – jspinella

関連する問題