MVC 路由 - 使用良好的编码标准生成路由 URL

MVC Routing - Generate the Route URL With Good Coding Standards

我正在学习如何在 MVC 中进行路由。在我看来,路由 API 只解决了一半的问题。我可以很容易地看到如何将传入的 URL 映射到控制器操作和参数。但是,我不清楚如何在我的页面源代码中生成这些路由 URL。

例如,在我的一个观点中,我使用这段代码来获取路由 URL:

<a class="listingResult" href="@Url.RouteUrl("ListingSEO", new { id = Model.Listing.ID, seoName = ListingController.SeoName(Model.Listing.Title) })">

出于以下几个原因,这对我来说似乎是一种糟糕的编码习惯:

  1. 如果以后路线发生变化,我的视图代码中可能有很多地方需要更新。
  2. View 现在需要 ListingController 的知识(也许这不是什么大问题?)
  3. 我的输入参数丢失了强类型,如果我拼错了参数名称,我的代码就会损坏,但这不会生成编译警告。

生成路由 URLs 时如何遵守良好的编码标准?替代方案似乎是在控制器中放置静态函数以生成路由,这至少可以解决问题 #1 和 #3。如果我和你一起工作,你看到上面的代码,你会有多不高兴?

我的建议:

  1. 在 ViewModel 中生成 URLs,而不是 View:这将使您的视图更清晰,逻辑更清晰。您可以将 UrlHelper 实例从控制器传递到 ViewModel,这也有助于我的下一点...
  2. 使用强类型URL生成技术:如delegate-based, expression-based or code generation.
  1. 使用命名路由的目的之一是抽象controller/action。您的命名路线不应该真正改变。至多,您只需更改他们命中的 controller/action,但这会在幕后无缝发生 ,因为您使用的是命名路由

  2. 您的视图需要了解控制器,因为您已经添加了对它的依赖。出于多种原因,这很糟糕。有很多不同的方法可以处理这个不需要依赖控制器,这取决于你在这里实际做什么,但至少,你应该简单地使用一个实用程序 class,所以至少它不会是特定于控制器的。

  3. 路由参数有意不是强类型的,因为路由在设计上是灵活的。你可以将任何你想要的东西传递给动作,有或没有参数来捕获它(你可以使用类似 Request 的东西来获取它而没有参数)。