Asp.net mvc 3 不带编码的ASP.NET MVC Razor呈现选择列表
如何在没有HTML编码的情况下获得要呈现的选择列表Asp.net mvc 3 不带编码的ASP.NET MVC Razor呈现选择列表,asp.net-mvc-3,Asp.net Mvc 3,如何在没有HTML编码的情况下获得要呈现的选择列表 @{ var noiceList = new SelectList(new[] { new {ID = "", Name = ""}, new {ID = "y", Name = "Yes after3Space"}, "ID", "Name"); } @Html.D
@{
var noiceList = new SelectList(new[] { new {ID = "", Name = ""},
new {ID = "y", Name = "Yes after3Space"},
"ID", "Name");
}
@Html.DropDownList("noice", @noiceList )
渲染
..
<option value="y">Yes&nbsp;&nbsp;&nbsp;3Space</option>
...
。。
是及;nbsp&;nbsp&;nbsp;3空间
...
如何让它改为渲染
<option value="y">Yes after3Space</option>
Yes在3space之后
这是因为Razor总是输出实体编码的html。在此上下文中,您应该能够调用(VS正在我的机器上更新,因此我无法进行快速测试)Html.Raw()
,如下所示:
var noiceList = new SelectList(new[] { new {ID = "", Name = ""},
new {ID = "y", Name = Html.Raw("Yes after3Space")},
"ID", "Name");
编辑:这不起作用。不幸的是,此行为不是内置的。
Html.DropDownList
方法(以及大多数其他HtmlHelper
方法)总是转义所有输入文本
变通办法
不过,还有一些变通办法。例如,您可以创建自己的HtmlHelper方法,该方法允许未经扫描的HTML
但是,如果您的需求像您的示例一样简单,那么这里有一个简单的解决方法:使用占位符,如
|
,然后将其替换为
,如下所示:
@{
var noiceList = new SelectList(new[] { new {ID = "", Name = ""},
new {ID = "y", Name = "Yes|||after3Space"},
"ID", "Name");
}
@Html.Raw(Html.DropDownList("noice", @noiceList).ToString().Replace("|", " "))
注意,您还可以创建一个简单的扩展方法来真正减少所需的代码量:
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("|", " ")
在C语言中实现这一点的最简单方法是使用
\xA0
而不是
,这样可以避免所有额外的代码
这个答案值得称赞:为什么不直接使用HTML-
是&;nbsp&;nbsp&;nbsp;3空间
可能的重复不幸的是,SelectList
生成了一个SelectList项
s的列表,它使用常规的字符串
表示名称
和值
。所以,这是行不通的:(是的,现在我想起来了,它不起作用。就像我说的,我无法测试它,因为VS当时正在更新。我一直在想,未来的MVC版本是否会包括对嵌套HTML的支持,比如说,SelectListItem.Name
可能是一个HtmlString
?但是,我不认为这是一个“漂亮的选择”解决方案,因为它应该只用于简单的标记。