Html.Raw () в представлении ASP.NET MVC Razor - PullRequest
44 голосов
/ 11 августа 2011
@{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 ]

72 голосов
/ 11 августа 2011

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

41 голосов
/ 16 ноября 2011

Принятый ответ правильный, но я предпочитаю:

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

Надеюсь, это кого-то вдохновляет, хотя я опаздываю на вечеринку.

10 голосов
/ 11 августа 2011

Вы не должны звонить .ToString().

Как четко указывается в сообщении об ошибке, вы пишете условие, в котором одна половина - это IHtmlString, а другая половина - строка.
Это не имеет смысла, так как компилятор не знает, какого типа должно быть все выражение.


Существует никогда причина звонить Html.Raw(...).ToString().
Html.Raw возвращает экземпляр HtmlString, который оборачивает исходную строку.
Вывод страницы Razor знает, что нельзя экранировать HtmlString экземпляров.

Однако, вызов HtmlString.ToString() просто возвращает исходное значение string снова; это ничего не дает.

...