匿名类成员中的短划线( - )

时间:2010-03-05 18:32:05

标签: c# .net .net-3.5

是否可以在匿名类的成员名称中使用短划线( - )?我主要感兴趣的是使用asp.net mvc将自定义属性传递给html-helpers,因为我希望我的html传递html5验证,这从数据开始 - 。

例如,这不起作用:

<%=Html.TextBoxFor(x => x.Something, new {data-animal = "pony"})%>

在成员名称前加上@也不起作用。

更新:如果这是不可能的,是否有推荐的方式来达到我的目的?我目前的临时解决方案是添加一个替换整个这样的东西:

<%=Html.TextBoxFor(x => x.Something, new {data___animal = "pony"}).Replace("___", "-")%>

但是这很糟糕,因为它很丑陋并且会在Model.Something包含三个下划线时中断。 Buhu。

5 个答案:

答案 0 :(得分:25)

在搜索同样的问题时刚发现这篇文章。

我找到了这个链接: http://blogs.planetcloud.co.uk/mygreatdiscovery/post/Using-custom-data-attributes-in-ASPNET-MVC.aspx

它解决了这个问题。它提到了以下内容:

  

[...]或更好,只需使用ASP.NET MVC源代码:

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

答案 1 :(得分:13)

收集Asp-Mvc版本特定的数据处理方法 -

MVC 3+:使用下划线_并将自动替换为mvc
MVC 1?,2:请参阅@ Jean-Francois的答案,该答案指向this

答案 2 :(得分:2)

不,因为破折号是C#操作符(minus),并且空格不重要。

目前,编译器认为您试图从animal中减去data,除非为相关类型指定了-运算符,否则这不起作用。

答案 3 :(得分:1)

无法使用 - 作为任何标识符的一部分。 http://msdn.microsoft.com/en-us/library/aa664670(VS.71).aspx

答案 4 :(得分:0)

不,你不能使用连字符。您需要使用字母数字字符,下划线或描述here的其他字符。 '-'被视为减号。 data-animal将被视为与data - animal相同,因此除非您单独定义dataanimal,否则甚至不会编译(如果您有data\u2014animaldata\u2014\u2014animal,它可能会出现细微的错误!)。

编辑:使用C#具有Unicode转义序列标识符的功能,您可以在标识符名称中获得破折号的效果。 “&amp; mdash”(较长的短划线字符)的转义序列为"U+2014"。因此,您将数据动物表达为{{1}}。但从编码风格的角度来看,我不确定为什么你不会选择更方便的命名约定。

另外,要点“2.4.2标识符(C#)”中的另一个要点:您不能在标识符中背对背地使用其中两个转义序列(例如{{1}})。