【问题标题】:When should I write an HTML helper as an extension method instead of a simple static method?我什么时候应该将 HTML 助手编写为扩展方法而不是简单的静态方法?
【发布时间】:2011-11-17 03:41:57
【问题描述】:

在 ASP.NET MVC 中有两种创建自定义 HTML 帮助器的方法:

  1. 您可以使用输出 HTML 的静态方法创建一个类,或者
  2. 您可以向 HtmlHelper 类添加扩展方法。

选项#1 似乎更简单、更容易。

  • 选项 #2 有什么优势?
  • 我什么时候想这样做而不是选项 #1?
  • 选项 #2 会给您带来任何好处或附加功能吗?

编辑添加:

在这种特殊情况下,我试图输出一个通过一堆条件逻辑形成的字符串。把它放在我的模型中似乎是错误的,但是在 Razor 中做这一切似乎既乏味又不必要——或者我错了吗?

【问题讨论】:

  • 还有第三种选择,也是我向您推荐的选择:使用 ViewModels 和 Display\Editor 模板。这样你就不会打破模式。所有 HTML 都保留在视图中,无需通过扩展和/或静态方法编写代码。
  • 查看this 帖子以获取有关如何操作的更多信息。这是做你将要做的事情的正确方法。

标签: asp.net-mvc html-helper


【解决方案1】:

在我们当前的项目中,我们首先做了很多 HtmlHelper 扩展,但我们意识到这样做是错误的,主要是因为:

  • 它打破了这种模式,因为您是在视图之外通过 C# 代码编写 HTML。
  • 这根本不适合验证!

所以我们简单地丢弃了几乎所有这些帮助器,并且我们已经为所有控制器实现了 ViewModel 和模板。这才是正确的做法。

这是最好的起点:ASP.NET MVC 2 Templates, Part 1: Introduction

归根结底,如果您是通过代码构建 HTML,那么您的项目的逻辑/模式有问题。

【讨论】:

  • 我明白你所说的为什么 HTMLHelpers 不好......但是看过模板后,我看不出它们在我正在尝试的这种特殊情况下如何帮助我输出通过一堆条件逻辑创建的字符串(带有一些 HTML)。可能是我误会了?
  • 该逻辑的位置在控制器中。对于视图,您只需传递需要很少或(理想情况下)根本不需要逻辑的数据。忘记 ViewBag\ViewData。通过 ViewModels 将所有数据传递给 View,并通过 DisplayTemplates 显示它们。相信我,你会长期感谢的。
  • 有趣!我没有想过将字符串构建逻辑放入控制器中。我想我会试一试,看看结果如何。谢谢!
  • 我拥有使用视图模型和模板制定的自定义表单元素的所有内容,除了如何通过我的验证属性向元素添加任意 HTML 属性,所以我不得不寻找帮助者,我不受限制。
【解决方案2】:

我发现选项 2 编写 HTML 时更简洁,因为它与 C# 代码分开。在实际的 razor 视图中,您应该放置 HTML。

这是假设您在谈论 razor 中的 @helper 语法

【讨论】:

  • 我不确定我们说的是同一件事。我见过的所有例子都是这样的:
猜你喜欢
  • 2010-09-17
  • 1970-01-01
  • 2016-02-15
  • 2011-03-12
  • 2012-09-15
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多