在ASP.NET MVC 4(beta)中,使用HTML-5 data-*属性是否存在问题?

8

根据这个问题,我应该能够像下面这样编写:

@Html.ActionLink( "Delete", "Delete", "Message", new { data_id=id, @class="delete" } )

或者像一个快乐的T4MVC用户一样可以这样做:

@Html.ActionLink( "Delete", MVC.Message.Actions.Delete(), new { data_id=id, @class="delete" } )

在渲染时替换"data_id"中的下划线:

<a href="/message/delete" class="delete" data-id="42">Delete</a>

然而,在MVC 4 Beta中似乎无效。是否有其他人遇到了这个问题?

这是一个有意的更改吗?如果是,我应该怎么做?

更新 - 如何手动修复

我已经对T4MVC.tt文件进行了以下更改,以解决生成代码中的问题:

public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, ActionResult result, object htmlAttributes, string protocol = null, string hostName = null, string fragment = null) {
    //was: return ActionLink(htmlHelper, linkText, result, new RouteValueDictionary(htmlAttributes), protocol, hostName, fragment);
    return htmlHelper.RouteLink(linkText, null, protocol, hostName, fragment, result.GetRouteValueDictionary(), HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
}

更新2 - 修复已经发布

David Ebbo非常迅速地回应了报告的问题,并已将上述修复合并到T4MVC中。

更新3 - 修复修复

尴尬的是,最初提交的修复实际上并没有起作用,因为它仍然调用了一个无效的重载。我现在已经修改了代码,使其与MVC内部使用的帮助程序方法相同,并通知David将其包含在T4MVC中。从codeplex获取2.6.70或在NuGet发布后进行更新,可能很快就会发布。


我更喜欢直接编写<a href="/message/delete" class="delete" data-id="@id">删除</a>。@Html.ActionLink()对UI不友好。 - user900202
但是,无论哪个都不是<a href="@Url.Action("Message","Delete")"等等。一个帮助程序和另一个一样丑陋,但是没有绕过它们的方法。 - Morten Mertner
1个回答

5

尝试一下:

@Html.ActionLink( "删除", "Delete", "Message", null, new { data_id=id, @class="delete" } )

我认为由于重载的原因,它假设你的第4个参数是routeValues参数。


是的,我相信这是正确的答案。在我的MVC4项目中,我已经成功使用了data-*属性,但是在ActionLink重载方面,我曾多次被绊倒。 - kaveman
这是一个明智的建议,但我实际上正在使用一个T4MVC扩展,它需要一个ActionResult,而且没有针对路由值的重载(所有内容都包含在ActionResult中)。因此,我确信我确实将变量传递到htmlAttributes参数中。更新帖子以显示我如何真正使用它(只是不想用T4MVC混淆视听)。 - Morten Mertner
嘿,谁知道呢。你是对的。T4MVC 在 MVC4 中必须调用错误的重载。谢谢! - Morten Mertner
2
我希望每次遇到这个问题都能得到一美元。在MVC框架的ActionLink/RouteLink中肯定存在重载问题。 - RPM1984

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