EF MVC RAZOR: Как декодировать HTML-кодированные строки вывода PartialView? - PullRequest
7 голосов
/ 16 февраля 2012

Я использую EF4 + MVC 3 с Razor.

У меня есть следующее ActionResult, которое переводит Dictionary<string,string> в частичное представление.

АКЦИЯ

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

Теперь специальные символы, содержащиеся в значениях Model.Key, кодируются в формате HTML, хотя я хотел бы использовать их как обычный текст. Например, <> '' отображается как &lt;&gt; &#39;&#39;.

Я попытался преобразовать их с WebUtility.HtmlDecode или Server.HtmlDecode, но безуспешно:

ЧАСТИЧНЫЙ ВИД (_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>

Не могли бы вы мне помочь? Я бы по возможности избегал использования String.Replace.

Ответы [ 3 ]

20 голосов
/ 16 февраля 2012

Для отображения текста без кодировки вы можете использовать @Html.Raw(value.key)

2 голосов
/ 16 февраля 2012

Ларри,

попробуйте это:

  <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 () возвращает экземпляр HtmlString, который оборачивает исходную строку.Движок Razor знает, что не следует избегать экземпляров HtmlString, поэтому отображение выполняется так, как задумано.

0 голосов
/ 09 октября 2015

Подумайте не об использовании 'string', а о IHtmlString, например, с HtmlString.

Например:

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>

Теперь вам не нужно полагаться на неявный договор безопасности между представлением(используя Html.Raw) и контроллер (предоставляющий надежный текст).Вы предоставляете действительный, безопасный HTML и помечаете его как таковой из источника.

...