1

ASP.Net MVC 中可用的大多数 Html 助手都具有object htmlAttributes. 这用于为输出的标签提供附加属性值。在使用匿名对象表示法指定 htmlAttributes 值时,它们的属性名称必须是有效的 c# 标识符。

现在,当您尝试输出带有破折号-字符的属性时会出现问题(例如,淘汰赛 js 的“data-bind”属性)

因此,例如,让我们以以下示例为例:

@Html.TextBox("Title", string.Empty, new { data-bind="text: title" })

在您的视图中尝试上面的代码,在运行时它会显示错误屏幕并显示以下消息:

Compilation Error

Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.

Compiler Error Message: CS0746: Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.

所以问题是,如何为 htmlAttributes 提供具有破折号的属性键;像“数据绑定”?

4

3 回答 3

5

在您的属性名称中,将所有短划线-字符替换为下划线_(如下面的示例所示):

@Html.TextBox("Title", string.Empty, new { data_bind="text: title" })

这会起作用,因为所有 HTML 助手在呈现 HTML 时都会将_属性名称中的下划线转换为破折号;-即对于您的示例,data_bind当在 html 中输出时转换为data-bind.

于 2013-09-17T13:31:14.490 回答
0

这并不总是正确的。假设您在 URL 中使用参数。

@Html.ActionLink("Add Job", "Index", "Home", new { foo_bar = "foobar" }, new { @class = "btn btn-default", data_foo = "bar" })

data_foo 确实呈现为“da​​ta-foo”,但参数保持为下栏。您的结果将是:http://your.domain/yourapp/?foo_bar=foobar

当然,您实际上不能使用破折号,否则您会收到 OP 中指定的错误。

我已经按如下方式解决了这个问题,但我很想看看未来出现的任何人是否会有更好的方法:

@{
   var link = Html.ActionLink("Add Job", "Index", "Home", new { foo_bar = "foobar" }, new { @class = "btn btn-default", data_foo = "bar" });
}

@Html.Raw(link.ToString().Replace('_', '-'))
于 2014-01-06T21:05:50.240 回答
0

使用HtmlHelper.AnonymousObjectToHtmlAttributes方法。以下代码将向文本输入框添加一个工具提示,该工具提示显示来自我模型上 MyIntVal 的 DisplayAttribute 描述的数据。

@{
    var htmlAttributesWithDashes =  HtmlHelper.AnonymousObjectToHtmlAttributes(
        new
        {
            id = "myTextBoxId",
            data_toggle = "tooltip",
            data_position = "left top",
            title = ModelMetadata.FromLambdaExpression( m => m.MyIntVal, ViewData ).Description
        }
        );


}

<div class="col-sm-6">
    @Html.TextBoxFor( m => m.MyIntVal, htmlAttributesWithDashes )
</div>
于 2015-08-21T16:53:39.283 回答