web-dev-qa-db-fra.com

Html.Raw () dans la vue 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++)

}

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.

45
Artur Keyan

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

72
archil

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.

41
rfmodulator

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.

10
SLaks