ASP.NET MVC Razor render SelectList без кодирования

как я могу получить свой список выбора для рендеринга без HTML-кодирования

@{
    var noiceList = new SelectList(new[] { new {ID = "", Name = ""}, 
                                   new {ID = "y", Name = "Yes   after3Space"}, 
                 "ID", "Name"); 
 }
 @Html.DropDownList("noice", @noiceList )

вынесено

..
<option value="y">Yes&amp;nbsp;&amp;nbsp;&amp;nbsp;3Space</option>
...

как мне получить его вместо render

<option value="y">Yes&nbsp;&nbsp;&nbsp;after3Space</option>

3 ответов


самый простой способ достичь этого в C# - использовать \xA0 вместо &nbsp; Так что вы можете избежать всего этого дополнительного кода.

это ответ: как сохранить пробелы в раскрывающемся списке - ASP.net MVC Razor views


к сожалению, это поведение не встроено. The Html.DropDownList способ (и большинство других HtmlHelper методы) всегда экранирует весь входной текст.

решение

однако есть обходные пути. Например, вы можете создать свой собственный метод HtmlHelper, который позволяет unescaped HTML.

но если ваши потребности так же просты, как ваш пример, Вот простой обходной путь:
Используйте заполнитель, например |, а затем замените его на &nbsp;, как это:

@{
    var noiceList = new SelectList(new[] { new {ID = "", Name = ""}, 
                                   new {ID = "y", Name = "Yes|||after3Space"}, 
                 "ID", "Name"); 
 }
 @Html.Raw(Html.DropDownList("noice", @noiceList).ToString().Replace("|", "&nbsp;"))

обратите внимание, вы также можете создать простой метод расширения, чтобы действительно уменьшить количество кода:

 public static HtmlString Replace(this HtmlString input, string findAll, string replaceWith) {
    return new HtmlString(input.ToString().Replace(findAll, replaceWith));
 }

это упрощает ваш HTML-код:

 @Html.DropDownList("noice", @noiceList).Replace("|", "&nbsp;")

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

var noiceList = new SelectList(new[] { new {ID = "", Name = ""}, 
                               new {ID = "y", Name = Html.Raw("Yes&nbsp;&nbsp;&nbsp;after3Space")}, 
             "ID", "Name");

EDIT: это не работает.