2012-02-16 10 views
6

Używam EF4 + MVC 3 z maszynką Razor.EF MVC RAZOR: Jak rozszyfrować zakodowane w HTML ciągi danych wyjściowych PartialView?

Mam następujące , które renderuje Dictionary<string,string> w częściowy widok.

ACTION

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

Teraz znaki specjalne zawarte w wartościach Model.Key HTML są kodowane, a chciałbym je wykorzystać jako zwykły tekst. Na przykład <> '' jest renderowany jako &lt;&gt; &#39;&#39;.

Próbowałem przekonwertować je WebUtility.HtmlDecode lub Server.HtmlDecode bez powodzenia:

częściowy widok (_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> 

mógłbyś mi pomóc? Unikałbym używania String.Replace, jeśli to możliwe.

+0

Czy możesz określić, co poszło nie tak z innymi dwoma podejściami? – linkerro

Odpowiedz

18

Aby wyświetlić tekst niekodowany, można użyć @Html.Raw(value.key)

+0

Dziękuję bardzo James! – Larry

2

Larry

spróbuj tego:

<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() zwraca instancję HtmlString która otacza oryginalny łańcuch. Silnik Razor wie, że nie ma uciec od instancji HtmlString, dlatego wyświetlanie jest zgodne z przeznaczeniem.

+0

Dziękuję bardzo Jim! Przyjąłem odpowiedź Jamesa tylko dlatego, że była pierwsza. +1 THX – Larry

+1

bez obaw - tak też bym to grał;) –

0

Uważaj, aby nie używać "ciągu", a raczej IHtmlString, na przykład z HtmlString.

Na przykład:

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>

Teraz nie trzeba polegać na niejawnej umowy bezpieczeństwa pomiędzy widzenia (używając Html.Raw) i sterownikiem (dostarczając tekst to jest, miejmy nadzieję, bezpieczne). Podajesz prawidłowy, bezpieczny HTML i oznaczasz go jako taki ze źródła.