MVC最佳实践|你是否建立了你的Url Helper链接?

时间:2009-04-02 01:44:43

标签: asp.net-mvc

只需阅读post about MVC best practices即可。该帖子的几个部分描述了构建辅助方法以链接到控制器上的操作。这是一个片段:

  

1)创建UrlHelper的扩展方法以生成您的网址   路线

     

避免传递控制器,动作   或者将名称路由为字符串,创建   UrlHelper的扩展方法   封装它,例如:

public static class UrlHelperExtension
{
    public static string Home(this UrlHelper helper)
    {
        return helper.Content("~/");
    }

    public static string SignUp(this UrlHelper helper)
    {
        return helper.RouteUrl("Signup");
    } 
}

我可以看到这会如何缩短视图中使用的链接......但我不知道这是一个“最佳实践”。也许我只是忽略了一些东西。我应该这样做来建立我的链接?这有什么好处,我只是没有看到?

他甚至接着说应该制作样式表,图片和javascript助手......

6 个答案:

答案 0 :(得分:3)

除非在多个地方引用路线,否则我可能不会这样做。我可以看到这样做的价值,我已经实现了HtmlHelper扩展,用于添加样式表和javascript包含添加使用“版本化”链接的功能,但我的常用链接作为ActionLinks包含在UserControl(菜单)中,对于大多数其他我使用ActionLink或BeginForm / AjaxForm来引用该操作。在某些方面,感觉就像为所有人创建新方法,但最常用的链接是增加复杂性以获得非常小的价值 - 您可以通过一些简单的UI手动测试获得的价​​值,这是您必须要做的反正。

答案 1 :(得分:2)

如果在将URL写为字符串时出错,则在运行时才会捕获它。这样,尝试引用尚未创建为扩展方法的路由将在编译时创建错误,您可以快速更正(如果使用Visual Studio,则更早)。如果您在制定路线时发现错误,则只需将其固定在一个地方。

虽然使用扩展方法不会使UrlHelpers混乱,但最好还是使用名为CommonUrls的静态类来保存静态只读属性(如果您愿意,还可以使用静态方法)。

编辑:我刚才意识到您需要将UrlHelper的实例传递给CommonUrls类。傻我。在这种情况下,扩展方法可能是工作的正确工具。

答案 2 :(得分:2)

这是一个人对最佳实践的看法。有几种情况可能会很好。如果您有人在处理URL结构时处理视图,则在完成URL后,您不必更新视图。

答案 3 :(得分:2)

如果其他人碰巧偶然发现这篇旧帖子,我建议使用David Ebbo的T4MVC模板:见his latest blog post here

答案 4 :(得分:1)

我不认为这是最佳做法。首先,你要沿着一堆扩展方法埋下结构细节的道路。 (虽然你可以使用资源作为路径,但这意味着高摩擦力的变化。)

此外,你什么时候停止?对于任何复杂的网站,您将需要很多这些帮助者。

在引用样式表,javascript,favicons等时,我使用了一种类似的方法,虽然我使用HtmlHelper而不是UrlHelper扩展,但从概念上讲,我认为它们更适合于任务。

此外,由于此类内容通常仅添加到母版页中,因此只需将完整路径传递给帮助程序并使其构建整个标记即可,而不仅仅是解析URI。

答案 5 :(得分:1)

我正在使用这个approch。 当您的应用程序站点地图可能发生变化时,它非常有用。 是的,你需要很多(我的扩展类计数1800行,带注释)

主要区别,就我而言,我使用强类型构建器构建URL。它看起来像这样:

    /// <summary>
    /// To campaign 'transfer credits' page
    /// </summary>
    public static string ToCampaignTransferCredits(this UrlHelper helper, int? idCampaignSource)
    {
        return To<CampaignController>(helper, c => c.Transfer(idCampaignSource));
    }

我认为这是一个非常好的做法(恕我直言),原因有以下几点:

  • 您在导航可用页面/操作与控制器之间有明确的分离。我最近不得不将方法从一个控制器移动到另一个控制器,它没有痛苦/重构/测试。
  • 它是编译所以如果您更改控制器的方法签名,您就会知道要做的更改(并且您只有1或2个更改,无需检查整个应用程序)
  • 你可以在你的控制器上使用继承和泛型,比如OOP geek,级联调用以及你发现的强大功能,这种方法将隐藏所有潜在的复杂性,离开简单地在视图中调用。