【问题标题】:MVC, how to avoid the Routing class from coupling with the Model?MVC,如何避免Routing类与Model耦合?
【发布时间】:2013-03-27 15:35:48
【问题描述】:

我正在研究 MVC 网站中的路由类。有些路由可能包含用户名:

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

其他标签:

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

路由类需要检测 URL 中是否存在用户名或标签。这意味着路由类将需要访问用户模型和标签模型来将 url 段与数据库进行比较。

目前只有我的控制器与模型接触,将 Routing 类与模型耦合感觉不太合适。有没有办法或任何架构解决方案来避免这种情况?

【问题讨论】:

  • 或者路由类访问模型就可以了?

标签: model-view-controller routing url-routing


【解决方案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} 模式进行路由。从数据的角度来看,它完全可以满足您的需求。

【讨论】:

    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 2012-08-18
    • 2018-03-19
    • 1970-01-01
    • 2012-05-02
    • 2020-08-15
    相关资源
    最近更新 更多