形成MVC /控制器/动作链接的最佳实践

时间:2014-04-02 19:12:58

标签: c# asp.net asp.net-mvc asp.net-mvc-4 razor

我想知道在某个控制器上指定操作的最佳做​​法是什么。

我正在处理的部分代码是将网址指定为:

<a href="/controller/action"/>

我一般不喜欢这种风格。我更喜欢使用:

<a href='@Url.Action("Action", "Controller")'/>

1)在这种情况下,为内部行为形成网址的最佳做法是什么?两者都有效,只是想知道什么是更好的。

2)使用一个与另一个相比是否有益处?

3 个答案:

答案 0 :(得分:4)

在这两个选项中我会说第二个是更好的方法,因为它可以用于虚拟路径/目录:

<a href='@Url.Action("Action", "Controller")'/>

我更喜欢使用ActionLinks:

@Html.ActionLink("text", "action", "controller")

答案 1 :(得分:3)

如果您真的想要,也可以创建StronlyTyped ActionLinks

@(Html.ActionLink<CustomersController>(x => x.Index(), "Customers"))

答案 2 :(得分:2)

@hutchonoid有点触及这一点,但虚拟路径只是好处的一部分。虽然默认路由模式为controller/action/id?,但它不会 。特别是如果你在MVC5 +中使用属性路由,URL可以是字面上的任何,甚至可能不包括控制器或动作名称。

通过使用Url.ActionHtml.ActionLink处理所有链接,您抽象了视图对URL的了解,这是一件非常好的事情。真正的关注点分离,这是MVC的基础,需要尽可能“愚蠢”,只知道或关心它需要的东西。

如果你最终使用属性路由,我会更进一步,实际上建议命名所有路由,然后使用Url.RouteUrl / Html.RouteLink而不是以动作为中心的版本。这提供了更大的抽象,因为您可以在不更改任何视图的情况下拥有完全不同的操作甚至是命名路径的控制器句柄。您也可以通过标准路由在技术上执行此操作,但使用标准路由命名路由将要求您手动定义每个路由,而不是依赖于默认路由或一组默认路由。