首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中使用HTML-5data-*属性中的破折号

如何在ASP.NET MVC中使用HTML-5data-*属性中的破折号
EN

Stack Overflow用户
提问于 2010-03-26 08:46:48
回答 8查看 152.5K关注 0票数 337

我正在尝试在我的ASP.NET MVC1项目中使用HTML5 data- attributes。(我是C#和ASP.NET MVC的新手。)

代码语言:javascript
复制
 <%= Html.ActionLink("« Previous", "Search",
     new { keyword = Model.Keyword, page = Model.currPage - 1},
     new { @class = "prev", data-details = "Some Details"   })%>

上述htmlAttributes中的"data-details“给出了以下错误:

代码语言:javascript
复制
 CS0746: Invalid anonymous type member declarator. Anonymous type members 
  must be declared with a member assignment, simple name or member access.

当我使用data_details时,它可以工作,但我猜它需要按照规范以"data-“开头。

我的问题:

  • 有没有办法实现这一点,并将HTML5数据属性与Html.ActionLink或类似的Html helper一起使用?
  • 是否有其他替代机制可以将自定义数据附加到元素?此数据稍后将由JS。

处理。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-03-26 09:27:45

更新:MVC3和更新版本对此有内置支持。有关推荐的解决方案,请参阅下面JohnnyO的高度支持的答案。

我不认为有任何直接的帮助来实现这一点,但我确实有两个想法供您尝试:

代码语言:javascript
复制
// 1: pass dictionary instead of anonymous object
<%= Html.ActionLink( "back", "Search",
    new { keyword = Model.Keyword, page = Model.currPage - 1},
    new Dictionary<string,Object> { {"class","prev"}, {"data-details","yada"} } )%>

// 2: pass custom type decorated with descriptor attributes
public class CustomArgs
{
    public CustomArgs( string className, string dataDetails ) { ... }

    [DisplayName("class")]
    public string Class { get; set; }
    [DisplayName("data-details")]
    public string DataDetails { get; set; }
}

<%= Html.ActionLink( "back", "Search",
    new { keyword = Model.Keyword, page = Model.currPage - 1},
    new CustomArgs( "prev", "yada" ) )%>

只是想法,还没有测试过。

票数 118
EN

Stack Overflow用户

发布于 2010-12-23 09:08:27

这个问题已经在HTMLMVC3中得到了解决,它们现在会自动将ASP.Net属性属性中的下划线转换为短划线。他们在这一点上很幸运,因为下划线在html属性中是不合法的,所以MVC可以自信地暗示当你使用下划线时你想要一个破折号。

例如:

代码语言:javascript
复制
@Html.TextBoxFor(vm => vm.City, new { data_bind = "foo" })

将在MVC 3中呈现:

代码语言:javascript
复制
<input data-bind="foo" id="City" name="City" type="text" value="" />

如果您仍在使用旧版本的MVC,您可以通过创建我从MVC3的源代码中借用的静态方法来模仿MVC3正在做的事情:

代码语言:javascript
复制
public class Foo {
    public static RouteValueDictionary AnonymousObjectToHtmlAttributes(object htmlAttributes) {
        RouteValueDictionary result = new RouteValueDictionary();
        if (htmlAttributes != null) {
            foreach (System.ComponentModel.PropertyDescriptor property in System.ComponentModel.TypeDescriptor.GetProperties(htmlAttributes)) {
                result.Add(property.Name.Replace('_', '-'), property.GetValue(htmlAttributes));
            }
        }
        return result;
    }
}

然后你可以像这样使用它:

代码语言:javascript
复制
<%: Html.TextBoxFor(vm => vm.City, Foo.AnonymousObjectToHtmlAttributes(new { data_bind = "foo" })) %>

这将呈现正确的data-*属性:

代码语言:javascript
复制
<input data-bind="foo" id="City" name="City" type="text" value="" />
票数 662
EN

Stack Overflow用户

发布于 2012-06-06 16:14:23

它甚至比上面提到的所有东西都要简单。MVC中包含破折号(-)的数据属性是通过使用下划线(_)来处理的。

代码语言:javascript
复制
<%= Html.ActionLink("« Previous", "Search",
 new { keyword = Model.Keyword, page = Model.currPage - 1},
 new { @class = "prev", data_details = "Some Details"   })%>

我看到JohnnyO已经提到了这一点。

票数 61
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2520487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档