2013-03-27 86 views
0

我正在使用MVC網站的Routing類。部分航線可能包含用戶名:MVC,如何避免路由類與模型耦合?

http://www.domain.com/John-Smith/ 

其他標籤:

http://www.domain.com/Fun-Stuff/ 

路由類將需要檢測,如果有一個用戶名或存在於URL的標籤。這意味着路由類將需要訪問用戶模型和標記模型,以便將url段與數據庫進行比較。

現在只有我的控制器與模型接觸,並且將Routing類與模型耦合並不合適。有沒有辦法,或者有什麼架構解決方案來避免這種情況?

+0

或者對於一個路由類訪問模型來說可能就好了? – boblapointe 2013-03-27 15:41:23

回答

1

我想你已經錯過了路由點。它幾乎可以做任何你想要的。 告訴它在哪裏映射。看看下面的路線的例子:

routes.MapRoute(
    "Default", 
    "{something}", 
    new { controller="MyDefault", action="Something", something=""}); 

於是用URL http://mydomain.com/miles-davis1234/將匹配路由指定的控制器和動作。在接下來的動作,你可以再使用{something}標記的值:

public ActionResult Something(string something) 
{ 
    // something = miles-davis1234 
    var x = this._myService.WorkOutWhatSomethingIs(something); 

    // now do something with x 
} 

那麼,現在回答你關於「檢測它是否是一個用戶名或標籤」查詢,你可以做一些像上面。雖然我不會推薦它。我會做到以下幾點:

routes.MapRoute(
    "Users", 
    "User/{username}", 
    new { controller="User", action="Detail", username="" }); 

routes.MapRoute(
    "Tags", 
    "Tag/{tag}", 
    new { controller="Tag", action="Search", tag="" }); 

因爲如果你想使用相同的路線/令牌,會發生什麼情況,例如做標記和用戶名,當某人的用戶名是一樣的標籤?你無法分辨差異。無論如何,MVC模式的重點是「RESTful」。應該代表控制器(模型),動作和任何其他元數據。在你的例子中,你可以(也可能應該)甚至使用基本的{controller}/{action}/{data}模式來進行路由。從數據的角度來看,它完全可以滿足你的需求。