ASP.NET MVC Razor视图中的Html.Raw()函数

47
@{int count = 0;}
@foreach (var item in Model.Resources)
{
    @(count <= 3 ? Html.Raw("<div class=\"resource-row\">").ToString() : Html.Raw("")) 
    // some code
    @(count <= 3 ? Html.Raw("</div>").ToString() : Html.Raw("")) 
    @(count++)

}

这部分代码无法编译,出现以下错误

Error   18  Type of conditional expression cannot be determined because there is no implicit conversion between 'string' and 'System.Web.IHtmlString'   d:\Projects\IRC2011_HG\IRC2011\Views\Home\_AllResources.cshtml  21  24  IRC2011

我该怎么办?


ToString会在页面中显示HTML字符串。例如,"<div></div>"。ToString()将显示<div></div>,而不是添加div元素。 - Artur Keyan
3个回答

77

Html.Raw() 返回的是 IHtmlString,而不是普通的字符串 string。因此,你不能将它们写在 : 操作符的相反位置。去掉那个 .ToString() 调用。

@{int count = 0;}
@foreach (var item in Model.Resources)
{
    @(count <= 3 ? Html.Raw("<div class=\"resource-row\">"): Html.Raw("")) 
    // some code
    @(count <= 3 ? Html.Raw("</div>") : Html.Raw("")) 
    @(count++)

}

顺便提一下,返回 IHtmlString 是MVC识别HTML内容并且不对其进行编码的方式。即使它没有导致编译器错误,调用 ToString() 也会破坏 Html.Raw() 的含义。


46

所接受的答案是正确的,但我更喜欢:

@{int count = 0;} 
@foreach (var item in Model.Resources) 
{ 
    @Html.Raw(count <= 3 ? "<div class=\"resource-row\">" : "")  
    // some code 
    @Html.Raw(count <= 3 ? "</div>" : "")  
    @(count++)
} 

虽然我来晚了,但我希望这能激励到某些人。


我唯一会做的更改是将字符串字面量移入常量中,并通过有意义的名称访问它们。 - Richard Barker

10

不应该调用.ToString()方法。

正如错误消息所清楚地表明的那样,您正在编写一个条件语句,其中一半是IHtmlString类型,而另一半是字符串。
这没有任何意义,因为编译器不知道整个表达式应该是什么类型。


永远不需要调用Html.Raw(...).ToString()方法。
Html.Raw返回一个包装原始字符串的HtmlString实例。
Razor页面输出知道不对HtmlString实例进行转义。

但是,调用HtmlString.ToString()方法只会再次返回原始字符串值,它没有任何作用。


3
ToString会在页面中显示HTML字符串。例如,"<div></div>"。ToString()将显示<div></div>,而不是添加div元素。 - Artur Keyan
5
我知道,我只是解释了为什么。 - SLaks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接