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

时间:2011-08-11 14:30:14

标签: asp.net-mvc razor

@{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

我必须做什么?感谢。

3 个答案:

答案 0 :(得分:72)

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()

的含义

答案 1 :(得分:41)

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

@{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++)
} 

我希望这会激励某人,即使我迟到了。

答案 2 :(得分:10)

您不应该致电.ToString()

正如错误信息明确指出的那样,你正在编写一个条件,其中一半是IHtmlString而另一半是字符串。
这没有意义,因为编译器不知道整个表达式应该是什么类型。


从不有理由致电Html.Raw(...).ToString() Html.Raw返回包装原始字符串的HtmlString实例 Razor页面输出知道不要转义HtmlString个实例。

但是,调用HtmlString.ToString()只会再次返回原来的string值;它没有完成任何事情。