Model view controller MVC,如何避免路由类与模型耦合?

Model view controller MVC,如何避免路由类与模型耦合?,model-view-controller,routing,url-routing,Model View Controller,Routing,Url Routing,我正在MVC网站上学习一门路由课程。某些路由可能包含用户名: http://www.domain.com/John-Smith/ 其他标签: http://www.domain.com/Fun-Stuff/ 路由类需要检测URL中是否存在用户名或标记。这意味着路由类将需要访问用户模型和标记模型,以便将url段与数据库进行比较 目前只有我的控制器与模型接触,将路由类与模型耦合起来感觉不太合适。有什么方法或架构解决方案可以避免这种情况吗?我认为您已经错过了路由的要点。它几乎可以做任何你想做的事情

我正在MVC网站上学习一门路由课程。某些路由可能包含用户名:

http://www.domain.com/John-Smith/
其他标签:

http://www.domain.com/Fun-Stuff/
路由类需要检测URL中是否存在用户名或标记。这意味着路由类将需要访问用户模型和标记模型,以便将url段与数据库进行比较


目前只有我的控制器与模型接触,将路由类与模型耦合起来感觉不太合适。有什么方法或架构解决方案可以避免这种情况吗?

我认为您已经错过了路由的要点。它几乎可以做任何你想做的事情告诉它映射到哪里。以以下路线为例:

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”URL。应该表示控制器(模型)、操作和任何其他元数据。在您的实例中,您甚至可以(而且可能应该)使用基本的
{controller}/{action}/{data}
模式进行路由。从数据的角度来看,它可以完全满足您的需要。

或者路由类访问模型也可以?