在asp.net mvc视图中将字符串显示为html


98

我有一个控制器生成包含html标记的字符串。现在,当我在视图上显示它时,它将显示为包含所有标签的简单字符串。我尝试使用HTML帮助程序进行编码/解码以正确显示它,但是它不起作用。

string str= "<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>";

在我看来

@Html.Encode(str)

6
我想Html.Raw应该有所帮助。
Saeed Neamati 2013年

另外,我认为您可以使用HtmlStrin课程,例如HtmlString str = new HtmlString("<span>Some HTML here</span>");
Saeed Neamati 2013年

Answers:


168

您已接近要使用的位置 @Html.Raw(str)

@Html.Encode接受字符串并确保正确处理所有特殊字符。这些包括空格之类的字符。


6
@ Html.Raw正是我在搜索的内容,谢谢您的回答:)
AFract

@Jerad Rose提到的IHtmlString要好得多
Pratyush Dhanuka

37

您应该IHtmlString改为使用:

IHtmlString str = new HtmlString("<a href="/Home/Profile/seeker">seeker</a> has applied to <a href="/Jobs/Details/9">Job</a> floated by you.</br>");

每当您具有需要保存HTML的模型属性或变量时,我都认为这通常是更好的做法。首先,它有点清洁。例如:

@Html.Raw(str)

相比:

@str

另外,与使用相比,我也认为它更安全一些@Html.Raw(),因为您的数据是否为HTML的问题一直保留在控制器中。在您拥有前端开发人员和后端开发人员的环境中,您的后端开发人员可能更适合于哪些数据可以保存HTML值,从而将这种担忧保留在后端(控制器)中。

我通常会尽量避免使用Html.Raw()

值得一提的另一件事是,我不确定您要分配的位置str,但是有些事情与我有关,您可能如何实现这一点。

首先,无论您的解决方案(IHtmlStringHtml.Raw),都应在控制器中完成。您应该避免这样的逻辑,因为它实际上并不属于该逻辑。

另外,您应该使用您ViewModel的视图来获取值(最好再次使用它IHtmlString作为属性类型)。看到类似的东西@Html.Encode(str)有点令人担忧,除非您这样做只是为了简化示例。


1
我想指出,控制器是用于路由而不是数据存储。另外,您的后端开发人员应该比更改代码的现有合同要好得多。UI应该绑定到模型,并且如果模型发生巨大变化,则单元测试应该会中断。
安东尼·梅森

感谢您的回答。我喜欢。
Thomas.Benz

是的,这个答案要好得多,我最初使用Html.Raw,但是当我阅读此答案时,我立即切换了
Pratyush Dhanuka

7

您可以使用 @Html.Raw(str)

有关更多信息,请参见MSDN

返回未经HTML编码的标记。

此方法使用IHtmlString类包装HTML标记,该类呈现未编码的HTML。


1

我对MVC中的HTML输入字段有类似的问题。该网页仅显示该字段的第一个关键字。示例:输入字段:“棕色狐狸”显示值:“ The”

解决方法是将变量放在value语句中的引号中,如下所示:

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">

0

我有类似的问题最近,谷歌将我放在这里,所以为了完整起见,我把这个答案放在这里,以防其他人也来到这里。

我注意到,当我对html进行格式错误时,实际上我的所有html标签都被剥离了只剩下非标签内容。我特别有一个缺少开头表格标记的表格,然后整个字符串中的所有html标记都被完全撕掉了。

因此,如果上述方法不起作用,并且您仍在抓挠头,请同时检查html是否有效。

我注意到,即使我开始使用它,MVC仍在没有标签的地方添加了tbody标签。这告诉我正在清理(MVC 5),并且当无法清理时,它将清除所有/某些标签。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.