2010-03-05 18 views
19

¿es posible usar dash (-) en un nombre de miembro de una clase anónima? Principalmente me interesa utilizar esto con asp.net mvc para pasar atributos personalizados a html-helpers, ya que quiero que mi html pase html5-validation, esto comenzando con data-.Dash (-) en el miembro de clase anónimo

Exemple que no funciona:

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

Poner una @ delante del nombre de miembro no hace el truco tampoco.

Actualización: Si esto no es posible, ¿hay una manera recomendada de hacer todo lo que quiero? Mi solución temporal actual es añadir un reemplazar a todo el asunto de esta manera:

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

Pero que aspira, porque es feo y se romperá cuando Model.Something contiene tres guiones. Buhu.

+0

Su solución no funciona en todos los escenarios: Html.DroppableZone (Zones.Left) .WrapIn ("div", new {@ data-role = "plegable"}). Render(); no devuelve una cadena sobre la que se puede reemplazar nada :-( –

Respuesta

2

No, porque el tablero es un operador C# (minus), y el espacio en blanco no es significativo.

En este momento el compilador piensa que está tratando de restar animal de data, que no funciona a menos que se especifique el operador - de los tipos en cuestión.

0

No, no puede usar el carácter de guión. Debe utilizar caracteres alfanuméricos, guiones bajos u otros caracteres descritos here. '-' se trata como un menos. data-animal se trataría igual que data - animal, por lo que ni siquiera se compilará a menos que haya definido por separado data y animal (¡y podría presentar errores sutiles si lo tiene!).

Editar: Con la capacidad de C# para tener identificadores con secuencias de escape Unicode, puede obtener el efecto de un guión en un nombre de identificador. La secuencia de escape para "& mdash" (el carácter más largo del tablero) es "U+2014". Entonces usted expresaría datos-animales como data\u2014animal. Pero desde el punto de vista del estilo de codificación, no estoy seguro de por qué no elegirías una convención de nombres más conveniente.

Además, otro punto a resaltar de "2.4.2 Identificadores (C#)": no puede tener dos de estas secuencias de escape una detrás de la otra en un identificador (por ejemplo, data\u2014\u2014animal).

+0

La convención de nomenclatura es de HTML5; http: //dev.w3. org/html5/spec/dom.html # embedding-custom-non-visible-data – svinto

+0

Ps sí, \ u2014 es como eh no óptimo. – svinto

+0

\ u002d es el carácter de guión. Cuando vi "guión" en la pregunta, pensó en el personaje "& mdash" primero. – David

24

Acabo de encontrar esta publicación al buscar el mismo problema.

He encontrado este enlace: http://blogs.planetcloud.co.uk/mygreatdiscovery/post/Using-custom-data-attributes-in-ASPNET-MVC.aspx

Se resuelve el problema. Menciona lo siguiente:

o [...] mejor aún, solo use el código de ASP.NET fuente 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; 
} 
+10

Desde el enlace: "Afortunadamente, se agregó una solución para esto en ASP.NET MVC 3 para que pueda usar un guión bajo que se convertirá automáticamente en un guión". – joelsand

+0

No tiene que hacer esto como dijo @ joelsand. Más aquí http://stackoverflow.com/a/9444822/245495 – Odys

+2

Bueno, eso apesta si quieres usar un guión bajo. – Triynko

11

Recogida de la versión Asp-MVC formas específicas de hacer Data- aquí:

MVC 3+: Utilice un guión bajo _ y será reemplazado automáticamente por mvc
MVC 1?, 2: vea @ Jean-Francois respuesta, que apunta a this

+1

La mejor solución aquí - funciona como un regalo en MVC4 – Spikeh

Cuestiones relacionadas