简体   繁体   中英

ASP.NET annoying URL encoding strings

I have this small function:

// Adds to menu
public void addMenuToList(int menuVal, string menuTxt, int depth, bool hasChildren)
{
    for (int i = 0; i < depth; i++)
    {
        menuTxt = "&nbsp;" + menuTxt;
    }
    if (hasChildren) { menuTxt = " + " + menuTxt; }

    ListItem newItem = new ListItem();
    newItem.Text = menuTxt;
    newItem.Value = menuVal.ToString();
    parent.Items.Add(newItem);
}

Which then goes on to create the following HTML:

<select size="4" name="ctl00$mainContent$parent" id="ctl00_mainContent_parent" class="tbox widebox">
    <option selected="selected" value="0">Top Level</option>
    <option value="1"> + Boxes</option>
    <option value="2">&amp;nbsp;&amp;nbsp;Wrapping</option>    
    <option value="8"> + &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;All Products</option>
</select>

It's url encoding the &nbsp; to &amp;nbsp; which spoils the formatting of the rendered select box. Any ideas how to prevent this happening? I need preliminary spaces in the options.

Try following:

string space = Server.HtmlDecode("&nbsp;");

for (int i = 0; i < depth; i++)
{
    menuTxt = space + menuTxt;
}

EDIT: nbsp is character with UTF-8 U+00A0 value (eg. it renders as a space, but isn't considered as a space by any of IsSpace method variants)

As far as I know you'll have to iterate the DropDownList's Items collection and call HttpUtility.HttpDecode on each option's Text property. I don't believe there's a way to prevent HTTP encoding for text values.

As an aside, do you know about the OPTGROUP tag? Unfortunately it cannot be nested (yet) but it may cover some of your cases:

http://htmlhelp.com/reference/html40/forms/optgroup.html

-Oisin

我会用css格式化间距...基本上你不需要文本,你只想在视觉上格式化选项...

The text is being double-HTMLEncoded for some reason.

Try this:

// Adds to menu
    public void addMenuToList(int menuVal, string menuTxt, int depth, bool hasChildren)
    {
        for (int i = 0; i < depth; i++)
        {
            menuTxt = "&nbsp;" + menuTxt;
        }
        if (hasChildren) { menuTxt = " + " + menuTxt; }

        ListItem newItem = new ListItem(menuVal.ToString(), menuTxt);
        parent.Items.Add(newItem);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM