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
Что я должен делать? Спасибо.
Ответы
Ответ 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
; он ничего не выполняет.