MVC中从模型/控制器传HTML字符串到视图 如何无需JS直接解析为DOM元素
MVC视图渲染HTML格式属性的解决方案
问题原因
- 最初的写法使用
<%:语法+Html.DisplayFor,二者默认都会对输出内容做HTML编码,会把<、>等标签符号转义为HTML实体,所以只能显示HTML源码,不会渲染成DOM元素。 - 尝试的写法把方法调用
HttpUtility.HtmlEncode放在DisplayFor的表达式参数里,违反了DisplayFor的用法限制:它的Lambda表达式只能直接指向模型的字段/属性,不能包含方法调用、运算等逻辑,所以抛出了对应的异常。另外需求是不编码HTML,这里调用HtmlEncode完全是反向操作。
解决方案
方案1:直接使用Html.Raw输出(最简便)
Html.Raw方法会直接返回原始HTML内容,不会做编码处理,直接替换原有代码即可:
<td style="max-width: 600px"> <%: Html.Raw(item.description) %> </td>
方案2:给属性加注解复用DisplayFor
如果要保留DisplayFor的写法,你可以在模型类的description属性上添加DataType注解,标记该属性为HTML格式:
[DataType(DataType.Html)] public string description { get; set; }
加完注解后,最初的Html.DisplayFor写法就可以正常渲染HTML内容,不需要修改视图代码:
<td style="max-width: 600px"> <%: Html.DisplayFor(modelItem => item.description) %> </td>
安全提醒
直接渲染原始HTML存在XSS跨站脚本攻击风险,请务必确保description属性的HTML来源完全可信,或者在入库、输出前对恶意脚本内容做过滤处理。
内容的提问来源于stack exchange,提问作者Sara N
相关产品推荐
相关产品推荐

