108

我有一个控制器,它生成一个包含 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)
4

5 回答 5

188

你很接近你想使用@Html.Raw(str)

@Html.Encode接受字符串并确保正确处理所有特殊字符。其中包括空格等字符。

于 2013-11-14T14:48:31.477 回答
45

您应该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

另外,我也认为它比 using 更安全@Html.Raw(),因为您的数据是否是 HTML 的问题保存在您的控制器中。在有前端开发人员与后端开发人员的环境中,您的后端开发人员可能更了解哪些数据可以保存 HTML 值,从而将这种关注保留在后端(控制器)中。

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

另一件值得注意的事情是,我不确定你在哪里分配str,但有几件事让我担心你可能如何实现这一点。

首先,这应该在控制器中完成,无论您的解决方案如何(IHtmlStringHtml.Raw)。在你看来,你应该避免任何这样的逻辑,因为它并不真正属于那里。

此外,您应该使用您ViewModel的获取值到您的视图(同样,理想情况下IHtmlString用作属性类型)。看到类似的东西@Html.Encode(str)有点令人担忧,除非你这样做只是为了简化你的例子。

于 2013-11-14T14:51:00.537 回答
8

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

有关更多信息,请参阅MSDN

返回非 HTML 编码的标记。

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

于 2013-11-14T14:50:47.887 回答
1

MVC 中的 HTML 输入字段也有类似的问题。该网页仅显示该字段的第一个关键字。示例:输入字段:“The quick brown fox” 显示值:“The”

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

<input class="ParmInput" type="text" id="respondingRangerUnit" name="respondingRangerUnit"
       onchange="validateInteger(this.value)" value="@ViewBag.respondingRangerUnit">
于 2016-01-05T13:08:39.413 回答
0

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

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

因此,如果上述方法不起作用,并且您仍在摸不着头脑,那么还要检查您的 html是否有效。

我注意到,即使在我让它工作之后,MVC 还在我没有的地方添加了 tbody 标签。这告诉我正在进行清理(MVC 5),并且当它不能发生时,它会删除所有/一些标签。

于 2019-03-10T08:11:32.360 回答