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

Art*_*yan 45 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++)

}
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我该怎么办?谢谢.

arc*_*hil 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++)

}
Run Code Online (Sandbox Code Playgroud)

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


rfm*_*tor 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++)
} 
Run Code Online (Sandbox Code Playgroud)

我希望这能鼓舞一个人,即使我迟到了.


SLa*_*aks 10

你不应该打电话.ToString().

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


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

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

  • 我知道.我刚刚解释了原因. (3认同)
  • ToString将在页面中显示HTML字符串.像"<div> </ div>".ToString()将显示<div> </ div>而不是添加div元素. (2认同)