2011-11-16 19 views
5

estoy tratando de hacer que el código HTML siguiente utilizando una navaja MVC3 Vista:Cómo representar atributos Html con valores de objeto utilizando ASP.NET MVC 3 Razor?

<input id="EffectiveDate" name="EffectiveDate" type="date" data-options='{"mode": "flipbox"}' /> 

he podido obtener las comillas en la ficha Opciones atribuyen a prestar. No importa lo que intento, que se representan como &quot;

Aquí hay un par de los muchos enfoques que he probado en mi opinión:

@Html.TextBoxFor(model => model.EffectiveDate, new { type = "date", data_options= " { 'mode':'flipbox' }"}) 

y

@Html.TextBoxFor(model => model.EffectiveDate, new { type = "date", data_options= @Html.Raw("{\"mode\":\"flipbox\"}")}) 

Cualquier sugerencia sobre cómo decodificar las comillas?

+0

¿Qué estás haciendo con ese campo? Si está utilizando jquery, puede que tenga que leerlo como una cadena html y decodificarlo en jquery, antes de usarlo. – jzm

+0

Estoy usando un complemento jQuery Mobile para convertir el cuadro de texto en un selector de fecha. El atributo 'data-options' define las opciones del selector de fecha. jQuery decodifica el objeto de opciones de datos como dices, así que todo funciona bien. Pero me gustaría saber cómo decodificar las comillas antes de renderizar, tanto para limpiar mi código como para futuras referencias. Parece algo que podría encontrar de nuevo en algún momento. – xcer

Respuesta

4

Usted puede hacer esto mediante la creación de una plantilla MVC editor. Primero, crea una carpeta llamada "EditorTemplates" dentro de la carpeta "Views \ Shared". Luego coloque un archivo llamado DateTime.cshtml dentro de la carpeta EditorTemplates.

A continuación, puede utilizar el método EditorFor() contra la propiedad de su modelo vista como esta (siempre que la propiedad de EFFECTIVEDATE de tipo DateTime):

@Html.EditorFor(m => m.EffectiveDate) 

El código completo para el editor de plantillas DateTime.cshtml se ve así:

@model System.DateTime 
@{ 
    var id = this.ViewData.TemplateInfo.GetFullHtmlFieldId(""); 
    var name = this.ViewData.TemplateInfo.GetFullHtmlFieldName(""); 
} 
<input id="@id" name="@name" type="date" data-options='{"mode": "flipbox"}' /> 

Esto producirá la salida exacta que está buscando.

+0

Ya estoy usando una plantilla de Editor para este campo (por motivos que no están relacionados con este problema), por lo que este enfoque me funcionará bien. ¡Gracias! Y gracias a @rdumont por explicar por qué las extensiones de entrada MVC siempre codificarán los atributos. – xcer

1

Una cosa es cierta: los símbolos especiales siempre se codificarán cuando utilice cualquiera de las extensiones de entrada MVC predeterminadas (es decir, TextBoxFor). Eso es porque TagBuilder en sí mismo, que se usa para construir las etiquetas para las extensiones HtmlHelper, HtmlEncode s cada valor de atributo en una etiqueta. Esto se puede ver en la fuente TagBuilder:

private void AppendAttributes(StringBuilder sb) 
{ 
    foreach (var attribute in Attributes) 
    { 
     string key = attribute.Key; 
     if (String.Equals(key, "id", StringComparison.Ordinal /* case-sensitive */) && String.IsNullOrEmpty(attribute.Value)) 
     { 
      continue; // DevDiv Bugs #227595: don't output empty IDs 
     } 
     string value = HttpUtility.HtmlAttributeEncode(attribute.Value); 
     sb.Append(' ') 
      .Append(key) 
      .Append("=\"") 
      .Append(value) 
      .Append('"'); 
    } 
} 

Dado que no hay manera de enviar ese valor ya decodificado, hay que decodificar por sí mismo en JavaScript. Aquí está un pequeño truco jQuery que lo hará:

var value = $('<textarea/>').html(yourElement.data('options')).val(); 

Es posible que desee hacer una función para la que, por supuesto.

Fuentes:

Cuestiones relacionadas