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中預先選擇產品。

因爲這個控制器是一個區域,這種 「默認網址」 將是這樣的:

/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