使用T4MVC创建带有URL片段的ActionLink

10

有没有办法创建一个带有哈希/井号/片段的强类型 T4MVC ActionLink?

例如,这是我想要创建的链接:

<a href="/Home/Index#food">Feed me</a>

但是T4MVC对象没有扩展能够做到这一点。

<%= Html.ActionLink("Feed me", T4MVC.Home.Index()) %>

所以,我最终需要做的是创建一个动作,然后以这种方式嵌入它:

<a href="<%= Url.Action(T4MVC.Home.Index()) %>"#food>Feed me</a>

这并不是很理想。请问有任何想法/建议吗?

提前感谢。


2
你需要编辑T4模板来添加这个功能。这并不难。但是在我看来,你应该使用url.Action助手(就像你的例子一样)。我觉得这样更易读。个人而言,我不喜欢在助手中生成如<a />标签这样简单的HTML代码。 - Mattias Jakobsson
你为什么不喜欢生成它呢? - Dan Atkinson
1
因为我认为生成 HTML 是视图本身的责任。你不需要一个帮助程序来编写像 <a /> 标签这样简单的东西。我只是认为如果你自己编写 <a /> 标签,代码会更易读。 - Mattias Jakobsson
你可以对RenderPartial、SelectList以及几乎所有其他Html助手提出同样的论点,但除非你有一个非常简单的网站,否则你需要一些幕后支持。 - Dan Atkinson
不需要使用RenderPartial来加载另一个视图,这里没有任何问题。对于selectlist也可以这样说,但是有一个非常好的理由使用它,可以强类型化您的id,以便它们正确地绑定。在这种情况下,在我看来,优点超过了缺点。但是,没有理由使用助手来呈现一个简单的<a/>标签。我从来不会为这种东西使用HTML帮助器。这只是我的个人意见,我可以理解有些人可能持不同意见。但是,在我看来,您最后一个例子(使用url helper)比第一个例子更加优雅,更易读。 - Mattias Jakobsson
4个回答

9

4
这在MVC v1中已经存在,但没有使用T4MVC的补充功能。我使用T4MVC的主要原因是摆脱你的示例中存在的魔术字符串。 - Dan Atkinson

8

我只能想到这种方法,比手动编写锚点略好一些(对我来说):

${Html.ActionLink("Feed me", T4MVC.Home.Index(), Fragment: "food")}

除了Spark视图引擎 - 它需要一个好的旧htmlhelper扩展方法和命名参数。

我认为这在默认的视图引擎中不可用?我决定为ActionLink编写一个快速扩展,但它并不优雅,我希望任何解决方案都可以在未来的T4MVC版本中提供给其他人。

Spark将<%=%>替换为${}。提到这一点是因为我更喜欢它(如果您强调代码优雅性,应该尝试一下)。使用命名参数需要C# 4.0。

这是因为我想避免丢失“food”参数映射到哪个参数的信息。


是的,我强烈同意Mattias Jakobsson的观点。


我假设这在默认的视图引擎中不可用?我决定为ActionLink编写一个快速扩展,但它并不优雅,而且我希望任何解决方案都能在未来的T4MVC版本中提供给其他人使用。 - Dan Atkinson
1
请参考David Ebbo的回答,现在已经使用T4MVC实现了。 - Paul Tyng

2

更新: 这个重载已经包含在T4MVC 2.6.56中了。

是的,为了完整性,我们可能应该将其添加到T4MVC中。这应该很容易做到,除非我们开始添加协议/主机名,否则我们会遇到很多重载问题。

如果我们停止支持Fx 3.5,事情会变得更容易,因为我们可以依赖默认/命名参数,这有助于减少重载问题。但是我一直避免这一步骤,因为并不是每个人都使用4.0。

也许我应该将当前版本冻结为最后一个Fx 3.5/MVC 1.x兼容版本,然后只在新版本中支持Fx 4.0/MVC 2(同时无限期保留旧版本)。总之,我离题了 :)


嗨David。感谢答案。是的,我认为对.NET 3.5进行冻结肯定会有助于鼓励人们转移到.NET 4/MVC 2。当然,这将使使用命名参数更加容易。 - Dan Atkinson

1

David Ebbo基于我在StackOverflow上提出的类似问题,为T4MVC添加了此功能。


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