【问题标题】:ASP.NET MVC @helper syntax vs Html Helper Extension methodsASP.NET MVC @helper 语法 vs Html Helper Extension 方法
【发布时间】:2013-07-23 09:09:17
【问题描述】:

我需要创建自定义 html 辅助方法。据我所知有两种方法:

  1. 使用@helper razor 语法。 http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

  2. 创建 HtmlHelper 扩展方法。

什么解决方案更好,为什么?有什么优点和缺点?

我只在 MVC 3 中读到,当 @helper 在单独的 .cshtml 文件中全局创建时,不可能使用其他内置的 html 帮助程序。不知道在 MVC 4 中是否可能。

请帮忙。

【问题讨论】:

标签: c# asp.net-mvc extension-methods razor-declarative-helpers


【解决方案1】:

@helper 的一个好处是,由于代码在视图中,您可以对其进行更改而无需重新编译代码。这使您可以在开发过程中快速轻松地调整助手。出于这个原因,我个人更喜欢尽可能将标记保留在视图中。

@helper 的一个相关好处是您的 HTML 将受益于智能感知,而用 C# 代码编写 HTML 则没有这样的好处。

此外,如果您正在编写一个不能在单个视图之外重用的助手,那么@helper 可以更容易地说明这一点。如果只打算使用一个 HtmlHelper 扩展方法(除非您设法将它放在一个类和命名空间中,只有该一个视图会看到扩展方法)。

【讨论】:

    【解决方案2】:

    什么解决方案更好,为什么?

    视情况而定。

    什么是优点和缺点?

    • 自定义 HtmlHelper 扩展的优点:
      • 无论您使用什么视图引擎,它都能正常工作
      • 它是可单元测试的
      • 它可以在应用程序之间移植
    • 自定义 HtmlHelper 扩展的缺点:
      • 在 C# 中编写大量 HTML 逻辑可能会变得很麻烦
    • @helper 的优点:
      • 没见过,没用过
    • @helper 的缺点:
      • 没见过,没用过

    事实上,@helper 恕我直言完全没用。当您想要我提到的关于自定义 HtmlHelper 扩展的优势时,您可以构建自定义 HtmlHelper 扩展。

    如果您遇到我提到的有关自定义 HtmlHelper 扩展的一些缺点,那么您可以使用局部视图。

    我只在 MVC 3 中在单独全局创建 @helper 时阅读过 .cshtml 文件无法使用其他内置的 html 助手。

    错了。您完全可以使用其他 Html 助手。您只需将它们作为参数传递:

    @helper FooBar(HtmlHelper html) {
        feel free to use the html helper here
    }
    

    当从视图中消费时:

    @HelperName.FooBar(Html)
    

    【讨论】:

    • 后续问题:我们可以从自定义 HTML 助手扩展方法中调用现有的 HTML 助手吗?例如,如果我构建了一个名为“CustomFieldDateTime”的自定义 HTML 帮助程序,我可以在里面渲染一个 Html.ValidationMessage("control4") 吗?还是我必须使用@helper 语法或部分视图?
    • 是的,您可以在自定义助手中调用现有的 HTML 助手。您可以通过将扩展方法引入范围 (using System.Web.Mvc.Html) 然后调用所需的方法来做到这一点。
    • 谢谢达林。我的解决方案取得了成功。我在我的 HtmlHelper 扩展方法中使用了以下代码 sn-p:'IHtmlString validationMsg = helper.ValidationMessage(controlName);'其中 helper 是“这个 HtmlHelper 助手”。
    • 我不会说它完全没用。如果您有一个复杂的视图,其中包含大量代码与 HTML 混合,最好有一个 @helper 以使代码更易于理解。
    • 使用@helper我们如何将lambda作为参数传递(i.e. model => model.Name)
    【解决方案3】:

    它们可以像用户控件和自定义控件一样

    在视图中使用@helper 进行剃刀样式格式设置。 使用通用解决方案的扩展方法, 例如重载需要额外参数的标签创建。

    您可以通过示例找到详细解释here

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2017-03-14
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-27
      • 1970-01-01
      • 2012-07-20
      相关资源
      最近更新 更多