Asp.net mvc 使用url片段创建T4MVC ActionLink

Asp.net mvc 使用url片段创建T4MVC ActionLink,asp.net-mvc,t4mvc,html.actionlink,Asp.net Mvc,T4mvc,Html.actionlink,有没有办法创建一个强类型的T4MVC ActionLink,其中包含一个hash/pound/fragment 例如,下面是我想创建的链接: <a href="/Home/Index#food">Feed me</a> 但是T4MVC对象没有扩展可以做到这一点 <%= Html.ActionLink("Feed me", T4MVC.Home.Index()) %> 所以,我最终要做的是创建一个动作,然后以这种方式嵌入它: <a href="

有没有办法创建一个强类型的T4MVC ActionLink,其中包含一个hash/pound/fragment

例如,下面是我想创建的链接:

<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>

这不是很理想。有人有什么想法/建议吗

提前感谢ASP.NET MVC 2.0中的。例如:

<%= Html.ActionLink("Feed me", "Action", "Controller", null, null, "food", null, null) %>

这种方法是我能想到的唯一一种感觉(对我来说)比手动编写锚略好的方法:

${Html.ActionLink("Feed me", T4MVC.Home.Index(), Fragment: "food")}
除了spark viewengine,它还需要1个很好的旧htmlhelper扩展方法和命名参数



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

Spark替换为${}。提到它只是因为我更喜欢它(如果你强调代码优雅,你应该试试)。使用命名参数需要C#4.0

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



是的,我非常同意Mattias Jakobson的观点。

更新:T4MVC 2.6.56中包含此重载

是的,为了完整性,我们可能应该将其添加到T4MVC中。这应该很容易做到,但如果我们也开始添加协议/主机名,那么最终会导致大量过载

如果我们停止支持FX3.5,事情会变得更容易,因为我们可以依赖默认/命名参数,这有助于减少过载。但到目前为止,我一直在避免这一步,因为还不是每个人都使用4.0


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

David Ebbo根据我在StackOverflow上制作的一个模板将此功能添加到T4MVC。

您必须编辑T4模板才能添加此功能。这应该不难。但在我看来,您应该使用url.Action助手(作为您的示例)。我觉得它更可读。就我个人而言,我不喜欢在助手中生成像标记这样简单的html。你为什么不喜欢生成它呢?因为我觉得生成html是视图本身的责任。您不需要助手来编写标记这样简单的东西。我只是觉得如果你自己写标签的话,可读性会更好。你可以对RenderPartial、SelectList和其他任何Html帮助程序进行同样的讨论,但是除非你有一个非常简单的网站,否则你需要一些幕后的东西。不。RenderPartial只需使用另一个视图,没有问题。您可以对selectlist说同样的话,但是使用它有一个很好的理由,您可以强式地键入您的id,这样它们将以正确的方式绑定。在我看来,在这种情况下,利大于弊。但是没有理由使用助手来呈现简单的标记。我从不使用html助手来处理这类事情。这只是我个人的观点,我可以理解有些人可能不同意。但在我看来,您的最后一个示例(带有url帮助器)比第一个示例优雅得多,只是可读性更强。MVC v1中已经提供了这一功能,但T4MVC增补版中没有。我使用T4MVC的主要原因是为了摆脱示例中出现的神奇字符串?我决定为ActionLink编写一个快速扩展,但它并不优雅,我希望任何解决方案都能在T4MVC的未来版本中提供给其他人。请参见下面David Ebbo的答案,这是T4MVC中的David。谢谢你的回答。是的,我认为在.NET3.5中冻结它肯定会有助于鼓励人们转向.NET4/MVC2。当然,使用命名参数会更容易。