Подтвердить что ты не робот

Html.Raw() в представлении 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

Что я должен делать? Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

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


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

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