C# 匿名类成员中的破折号(-)
可以在匿名类的成员名称中使用破折号(-)吗?我主要感兴趣的是使用asp.net mvc将自定义属性传递给html助手,因为我希望我的html通过html5验证,这从数据开始 不起作用的示例:C# 匿名类成员中的破折号(-),c#,.net,.net-3.5,C#,.net,.net 3.5,可以在匿名类的成员名称中使用破折号(-)吗?我主要感兴趣的是使用asp.net mvc将自定义属性传递给html助手,因为我希望我的html通过html5验证,这从数据开始 不起作用的示例: <%=Html.TextBoxFor(x => x.Something, new {data-animal = "pony"})%> x.某物,新的{data animal=“pony”})%> 在成员名称前面加一个@也不会起作用 更新:如果这是不可能的,有没有一个建议的方法来做我想要
<%=Html.TextBoxFor(x => x.Something, new {data-animal = "pony"})%>
x.某物,新的{data animal=“pony”})%>
在成员名称前面加一个@也不会起作用
更新:如果这是不可能的,有没有一个建议的方法来做我想要的?我目前的临时解决方案是在整个过程中添加一个替换,如下所示:
<%=Html.TextBoxFor(x => x.Something, new {data___animal = "pony"}).Replace("___", "-")%>
x.某物,新的{data\uuuuuuu animal=“pony”})。替换(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
但这很糟糕,因为它很难看,当
Model时会破裂。Buhu.否,因为破折号是一个C#运算符(),而空格并不重要
现在,编译器认为您正在尝试从数据中减去动物,除非为所讨论的类型指定了-
运算符,否则该操作无效。不可能将-,用作任何标识符的一部分。
不,不能使用连字符。您需要使用字母数字字符、下划线或描述的其他字符<代码>'-'
被视为减号<代码>数据动物
将被视为与数据-动物
相同,因此,除非您分别定义了数据
和动物
(如果您定义了,它可能会出现微妙的错误!),否则它甚至不会编译
编辑:有了C#的能力,就可以使用Unicode转义序列生成标识符,您可以在标识符名称中获得破折号的效果。“&mdash”(较长的破折号字符)的转义序列为。因此,您可以将数据动物表示为data\u2014animal
。但从编码风格的角度来看,我不确定为什么不选择更方便的命名约定
另外,“2.4.2标识符(C#)”中需要强调的另一点是:标识符中不能有两个这样的转义序列(例如data\u2014\u2014animal
)。在搜索同一问题时刚刚找到了这篇文章
我找到了这个链接:
它解决了这个问题。它提到以下几点:
[…]或者更好,只需使用ASP.NET MVC源代码:
收集Asp Mvc版本特定数据的方法-此处:
MVC 3+:使用下划线,它将自动被MVC替换
MVC 1?,2:见@Jean Francois answer,它指出命名约定来自HTML5;Ps yeah,\u2014好像不是最优的。\u002d是连字符。当我看到问题中的“破折号”时,我首先想到了“&mdash”字符。@svinto:你说得对,\u2014不是最优的。我只是指出,如果你想要破折号字符,你实际上可以在标识符中使用它。这就是说,即使您确实有办法使这些\u*标识符更具可读性,它们看起来也会与标识符中不允许使用的字符('-'等)相同(除非语法突出显示不同,但必须承认,我对此不太精通)。不。。。新的{@data\u002drole=“collapsible”}未编译。从链接中可以看到:“幸运的是,ASP.NET MVC 3中添加了一个解决方案,因此您可以使用下划线,下划线将自动转换为连字符。”您不必像@joelsand所说的那样执行此操作。如果你想用下划线的话,这很糟糕。这个答案是正确的,但不完整。有一个解决办法。请看我对这个问题的回答。您的解决方案并不是在所有情况下都有效:Html.DroppableZone(Zones.Left).WrapIn(“div”,new{@data role=“collapsable”}).Render();不返回可以替换任何内容的字符串:-(
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;
}