1

ユーザーが製品に対して「質問する」ページがあります。ASP.NET MVC 3 - エリア内のルーティングを持つエッジケース

ルートがある:

context.MapRoute(
       "Q&A - Ask - by Product", 
       "{someProductUri}/questions/ask", 
       new { controller = "Questions", action = "Ask" } 
      ); 

一致する:

/車/質問/尋ねる

/電話/質問/

を尋ねるここでアクションがあります:

public class QuestionsController : Controller 
{ 
    public ViewResult Ask(string someProductUri) 
    { 
     // ... 
    } 
} 

問題は、ユーザーがページ内で商品を選択できるようにする必要があることです。たとえば、URIであらかじめ選択されている商品はありません。このコントローラは、エリアにあるので

、この "デフォルトのURLは、" このようになります:

/myarea /質問/私が得るとき、だから、何が起こっているかである

を尋ねます"someProductUri"は "myarea"に設定され、あらゆる種類の悲しみを引き起こします。

両方のURLのセットに対して同じアクション/ビューを再利用したいのですが、ルート値がデフォルトURLの場合は「myarea」に設定しないようにします。

希望があれば - どんなアイデアですか?

私は別個のルートが必要ですか? "someProductUri"が "myarea"にならないようにルート制約を追加して、ルートと一致せずデフォルトに戻すことはできますか?

答えて

3

私はすでに多くのルートを持っているので、私はちょうどこのエッジケースのために別のものを追加したくありませんでした。私はいつでも私は、エッジ例このタイプに遭遇して再使用することができます -

public class NotEqualToAreaName : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return String.Compare(values[parameterName].ToString(), route.DataTokens["area"].ToString(), true) != 0; 
    }  
} 

は非常にシンプル、かつ汎用的な:

は、だから私は、ルートの制約を使用して終了しました。

2

あなたが地域のために別々のルートを追加する必要があります。

context.MapRoute(
      "Q&A - Ask - by Product", 
      "myarea/questions/ask", 
      new { controller = "Questions", action = "Ask" } 
     ); 
+0

はい、私はそれを行うことができましたが、私はこれがデフォルトのエリアルートで処理できることを望んでいました。 – RPM1984

+0

あなたのルートが 'myarea'にマッチするのを止めるための制約を追加することができます。 – SLaks

+0

正確には今何をしようとしていますか:) "notEqualtoareaNameconstraint"。 :) – RPM1984

関連する問題