@{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++)
}
Cette partie de code ne compile pas, avec l'erreur suivante
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
Qu'est-ce que je dois faire? Merci.
Html.Raw()
retourne IHtmlString
, pas l'ordinaire string
. Donc, vous ne pouvez pas les écrire dans les côtés opposés de l'opérateur :
. Supprimer cette .ToString()
appelant
@{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++)
}
En passant, renvoyer IHtmlString
est le moyen par lequel MVC reconnaît le contenu HTML et ne l'encode pas. Même s'il n'a pas causé d'erreur de compilation, appeler ToString()
détruirait le sens de Html.Raw()
La réponse acceptée est correcte, mais je préfère:
@{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++)
}
J'espère que cela inspire quelqu'un, même si je suis en retard à la fête.
Vous ne devriez pas appeler .ToString()
.
Comme le message d'erreur l'indique clairement, vous écrivez une condition dans laquelle une moitié est un IHtmlString
et l'autre moitié est une chaîne.
Cela n’a aucun sens, car le compilateur ne sait pas quel type d’expression doit être.
Il y a jamais une raison d'appeler Html.Raw(...).ToString()
.Html.Raw
Renvoie une instance HtmlString
qui enveloppe la chaîne d'origine.
La sortie de la page Razor sait qu'elle ne doit pas échapper à HtmlString
instances.
Cependant, l'appel de HtmlString.ToString()
ne renvoie que la valeur d'origine string
; cela ne fait rien.