2013-03-27 80 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}模式来进行路由。从数据的角度来看,它完全可以满足你的需求。