【问题标题】:ASP.NET MVC Razor render SelectList without encodingASP.NET MVC Razor 无需编码即可呈现 SelectList
【发布时间】:2011-09-15 10:27:03
【问题描述】:

如何让我的选择列表在没有 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>
...

如何让它改为渲染

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

【问题讨论】:

标签: asp.net-mvc-3


【解决方案1】:

在 C# 中实现此目的的最简单方法是使用 \xA0 而不是 &amp;nbsp;,这样您就可以避免所有额外的代码。

归功于这个答案:How to retain spaces in DropDownList - ASP.net MVC Razor views

【讨论】:

    【解决方案2】:

    不幸的是,这种行为不是内置的。 Html.DropDownList 方法(和大多数其他 HtmlHelper 方法)总是转义所有输入文本。

    解决方法

    但是,有一些解决方法。例如,您可以创建自己的 HtmlHelper 方法来允许未转义的 HTML。

    但是,如果您的需求与您的示例一样简单,这里有一个简单的解决方法:
    使用占位符,例如|,然后将其替换为&amp;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;")
    

    【讨论】:

      【解决方案3】:

      这是因为 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");
      

      编辑:这不起作用。

      【讨论】:

      • 不幸的是,SelectList 生成了一个SelectListItems 列表,它使用普通的旧string 来表示NameValue。所以,这行不通:(
      • 是的,现在我想起来了,这行不通。就像我说的,我无法测试它,因为当时 VS 正在更新。
      • 我一直在想,未来版本的 MVC 是否会支持像这样的嵌套 HTML —— 或许 SelectListItem.Name 可以改为 HtmlString?但是,我不认为这是一个“漂亮”的解决方案,因为它应该只用于简单的标记。
      猜你喜欢
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 2016-10-10
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多