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

时间:2015-03-11 00:43:24

标签: asp.net-mvc asp.net-mvc-routing

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

例如,在我的一个视图中,我使用此代码来获取路径URL:

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

这对我来说似乎是一种糟糕的编码习惯,原因如下:

  1. 如果路线将来发生变化,我的View代码中可能会有很多需要更新的地方。
  2. View现在需要了解ListingController(也许这不是什么大问题?)
  3. 我在输入参数上输掉了强力打字,如果我拼错了参数名称,我的代码就会被破坏,但这并没有产生编译警告。
  4. 在生成路径网址时如何观察良好的编码标准?替代方案似乎是在控制器中放置静态函数来生成路由,这至少可以解决问题#1和#3。如果我和你一起工作并且你看到了上面的代码,你会有多不开心?

2 个答案:

答案 0 :(得分:1)

我的建议:

  1. 在ViewModel中生成网址,而不是视图:这将使您的视图更清晰,逻辑更自由。您可以将UrlHelper实例从控制器传递到ViewModel,这也有助于我的下一步......
  2. 使用强类型网址生成技术:例如delegate-basedexpression-basedcode generation

答案 1 :(得分:1)

  1. 使用命名路由的目的之一是抽象控制器/操作。您指定的路线不应该真正改变。最多,您只需更改他们所点击的控制器/操作,但这会在幕后无缝地发生,因为您正在使用命名路径

  2. 您的视图需要知道控制器,因为您已经添加了对它的依赖。出于多种原因,这很糟糕。您可以通过多种不同的方式处理这种情况,这种方式不需要依赖控制器,具体取决于您在此处实际执行的操作,但至少应该使用实用程序类,所以至少它不是特定于控制器的。

  3. 路线参数故意不是强类型的,因为路线设计灵活。您可以将任何您想要的内容传递给操作,无论是否有参数来捕获它(您可以使用类似Request之类的东西来获取它而不需要参数)。