ASP.NET MVC的HTML Helper被高估了吗?

15

我很可能没有理解到点子上,但我真的弄不清楚ASP.NET MVC的HTML Helpers怎么能帮助我。下面是一个示例:

HTML:

<a href="ActionName" target="_blank">Click Me</a>

HTML助手:

<%= Html.ActionLink("Click me", "ActionName", null, new {target="blank"}) %>

我更容易阅读HTML,因此使用HTML Helpers似乎违反直觉。

看一下以下论点:

  • 许多人(甚至是新手)知道如何阅读HTML。HTML Helper语法可能会容易引起混淆。
  • 在许多情况下,编写HTML“helper”需要更多的输入,而实际编写HTML所需的输入要少得多。
  • HTML Helper将输出实际的HTML,因此为什么不直接编写HTML呢?
  • 编写HTML可以更好地控制语法和标准。你可以让它符合任何你想要的HTML标准。

除了我没有理解的特殊强制性原因(因为我是自学MVC的,可能有缺陷),还有什么理由使我想要使用HTML Helpers呢?

或者它们只是代码噪音吗?


但是请注意,如果您使用<a>方法,那么您将被视为过时的开发人员,因为他们认为自己很棒,因为他们知道本周的流行趋势。 - Christine
4个回答

15

6
您仍然可以使用<a>标签,并通过在href属性中添加<%= Model.LinkUrl %>或<%= MyUrlProvider.Someurl %>来保持URL的动态性(非硬编码)。 - Alex
6
如果你重新组织你的网站,增加一个层级,比如"/company/home/login",那么你需要手动更改你的链接,而不是在一个集中的位置进行更改。 - womp
3
@Cyril: 如果URL包含一些参数怎么办?例如,SO为每个问题生成动态URL。你无法硬编码它。@Alex: 别忘了需要对输入进行清理,否则你将容易受到XSS攻击的威胁。 - Mehrdad Afshari
8
使用ActionLink生成的URL也会遵循在Global.asax中设置的路由。 - Robert Harvey
2
这并没有解释为什么使用 <a href='@Url.Action("Action", "Controller")'>Link</a> 不如使用 ActionLink 更可取。 - David Schwartz
显示剩余6条评论

9
假设您在URL中有许多查询参数,如site.com?a=1&b=2&c=3&d=4&e=1&f=1。
<%= Html.ActionLink("Click me", "ActionName", null, new {a=1, b=2, c=3, d=4, e=1, f=1}) %>

actionlink可以为您构建此URL。如果没有这个帮助程序,您将不得不手动向URL添加键和值。这真的很麻烦。URL助手还可以匹配URL路由。


这是一个非常好的“支持”示例,而不是“反对”。 - Funka

7
更好的选择是使用MvcContrib来替换那些容易出错的“魔术字符串”,并将它们替换为lambda表达式。
<%= Html.ActionLink<MyController>(x => x.ActionName() ,"Click me",new {target="blank"}) %>

1
是的,我看到了有趣的“流畅HTML”。但说真的,那绝对是给极客们用的!虽然我承认自己也是一个极客,但它们让我感到非常害怕。它们看起来不太易读。 - Cyril Gupta
使用lambda表达式可能会因为[ActionName("..")]属性而出现问题。我认为最好避免使用它们。 - stej
这实际上与为什么应该使用HTML助手而不是原始HTML没有任何关系,除非你的论点是第三方库已扩展ActionLink以允许您使用强类型引用生成链接,但似乎在该链接背后的相同代码可以扩展UrlHelper,因此您可以自己创建锚标记。 - David Schwartz

0

实际上,这并没有太大的区别。

<a href="ActionName" target="_blank">Click Me</a>

并且

<%= Html.ActionLink("Click me", "ActionName", null, new {target="blank"}) %>

因为在这两种情况下,你都在硬编码(第一种情况是URL,后者是操作名称)。

这就是为什么我会创建特定的链接帮助方法,然后使用它们。

<%= Html.LinkSomeAction("Click me") %>

这样我就可以确信,当我改变对动作名称的想法时,我会没问题;此外,我永远不必担心打错动作名称或链接。

mxmissile提出的解决方案也很好。


这可能会导致很多不必要的方法重载,如果您想添加CSS类或控制在路由中生成的数据怎么办?在我看来,您的操作名称不应该经常更改。操作名称应具有意义,路由应对用户有帮助。 - Kyle LeNeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接