如何在HTML中使用破折号

我正在尝试在ASP.NET MVC 1项目中使用HTML5数据属性。 (我是一个C#和ASP.NET MVC新手。)

 <%= Html.ActionLink("« Previous", "Search",
     new { keyword = Model.Keyword, page = Model.currPage - 1},
     new { @class = "prev", data-details = "Some Details"   })%>

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

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

它适用于我使用data_details时,但我想它需要按照规范开始“数据 - ”。

我的问题:

  • 有没有什么办法可以使用Html.ActionLink或类似的Html帮助程序来使用HTML5数据属性?
  • 是否有任何其他替代机制将自定义数据附加到元素? 这些数据将在稍后由JS处理。

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

    我不认为有实现这一目标的直接帮助者,但我有两个想法可供您尝试:

    // 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" ) )%>
    

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


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

    例如:

    @Html.TextBoxFor(vm => vm.City, new { data_bind = "foo" })
    

    将在MVC 3中进行渲染:

    <input data-bind="foo" id="City" name="City" type="text" value="" />
    

    如果您仍在使用较旧版本的MVC,那么您可以通过创建从MVC3的源代码中借用的静态方法来模仿MVC 3所做的工作:

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

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

    <%: Html.TextBoxFor(vm => vm.City, Foo.AnonymousObjectToHtmlAttributes(new { data_bind = "foo" })) %>
    

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

    <input data-bind="foo" id="City" name="City" type="text" value="" />
    

    它比上面提到的一切都更容易。 包含破折号( - )的MVC中的数据属性通过使用下划线(_)来满足。

    <%= Html.ActionLink("« Previous", "Search",
     new { keyword = Model.Keyword, page = Model.currPage - 1},
     new { @class = "prev", data_details = "Some Details"   })%>
    

    我看到约翰尼已经提到这一点。

    链接地址: http://www.djcxy.com/p/23357.html

    上一篇: How to use dashes in HTML

    下一篇: Get ControllerName and ActionName and populate the ViewData in Master Page?