9

How can I get my select list to render without HTML coding

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

rendered

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

How do I get it to instead render

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

3 Answers 3

12

The easiest way to achieve this in C# is to use \xA0 instead of &nbsp; so you can avoid all that extra code.

Credit goes to this answer: How to retain spaces in DropDownList - ASP.net MVC Razor views

Sign up to request clarification or add additional context in comments.

Comments

3

Unfortunately, this behavior is not built-in. The Html.DropDownList method (and most other HtmlHelper methods) always escapes all input text.

Workaround

There are workarounds, however. For example, you could create your own HtmlHelper method that allows unescaped HTML.

But if your needs are as simple as your example, here's a simple workaround:
Use a placeholder, such as |, and then replace it with &nbsp;, like this:

@{
    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;"))

Note, you could also create a simple extension method to really reduce the amount of code required:

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

This simplifies your Html code to:

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

Comments

0

It's because Razor always outputs entity-encoded html. You should be able to call (VS is updating on my machine right now, so I can't do a quick test) Html.Raw() in this context, like so:

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

EDIT: This does not work.

3 Comments

Unfortunately, the SelectList produces a list of SelectListItems, which uses a regular old string for Name and Value. So, this won't work :(
Yeah, now that I think about it, it wouldn't work. Like I said, I couldn't test it because VS was updating at the time.
I've been wondering if a future version of MVC will include support for nested HTML like this -- perhaps SelectListItem.Name could be a HtmlString instead? However, I don't think this is a "pretty" solution, because it should only be used for simple markup.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.