2012-02-16 16 views
6

Estoy usando EF4 + MVC 3 con Razor.EF MVC RAZOR: ¿Cómo decodificar cadenas codificadas HTML de una salida PartialView?

Tengo el siguiente ActionResult, que representa un Dictionary<string,string> en una vista parcial.

ACCIÓN

public ActionResult combotest() 
{ 
    Dictionary<string, string> r = new Dictionary<string, string>(); 
    r.Add("<> ''", "T"); 
    ... 
    return PartialView("_mypartial", r); 
} 

Ahora, caracteres especiales contenidas en los Model.Key valores son codificados en HTML, mientras que me gustaría usarlos como texto sin formato. Por ejemplo, <> '' se representa como &lt;&gt; &#39;&#39;.

Me trataron de convertirlos con WebUtility.HtmlDecode o Server.HtmlDecode sin éxito:

VISTA PARCIAL (_mypartial):

<select> 
    <option value=''></option> 
    @foreach (KeyValuePair<string,string> value in (Dictionary<string, string>)Model) 
    { 
     <option value="@WebUtility.HtmlDecode(value.Key)">@value.Value 
    </option> 
    } 
</select> 

¿Me podría ayudar? Evitaría usar String.Replace, si es posible.

+0

¿Podría especificar qué salió mal con los otros dos enfoques? – linkerro

Respuesta

18

para mostrar texto sin codificar puede utilizar @Html.Raw(value.key)

+0

Muchas gracias James! – Larry

2

Larry,

intente esto:

<select> 
    <option value=''></option> 
     @foreach (KeyValuePair<string,string> value in (Dictionary<string, string>)Model) { 
     <option value="@Html.Raw(value.Key)">@value.Value 
    </option> 
    } 
    </select> 

Html.Raw() devuelve una instancia HtmlString que envuelve la cadena original. El motor Razor sabe que no debe escapar de las instancias de HtmlString, por lo que la visualización es como se esperaba.

+0

¡Muchas gracias Jim! Acepté la respuesta de James solo porque era la primera. +1 THX – Larry

+1

no te preocupes, así es como lo jugaría también;) –

0

Considere la posibilidad de no utilizar 'cadena' en primer lugar, sino más bien IHtmlString, por ejemplo con HtmlString.

Por ejemplo:

public ActionResult combotest() { Dictionary<IHtmlString, string> r = new Dictionary<IHtmlString, string>(); r.Add(new HtmlString("<> ''"), "T"); ... return PartialView("_mypartial", r); }

<select> <option value=''></option> @foreach (KeyValuePair<IHtmlString,string> value in (Dictionary<IHtmlString, string>)Model) { <option value="@value.Key">@value.Value </option> } </select>

Ahora, usted no tiene que depender de un contrato de seguridad implícito entre la vista (usando Html.Raw) y el controlador (que proporciona el texto eso es afortunadamente seguro). Proporciona Html válido y seguro y lo marca como tal desde la fuente.

Cuestiones relacionadas