Razor - HTML.RAW does not output text

2019-02-07 17:37发布

问题:

I have tried all solution proposed to other, similar questions but none of them seems to work. In essence I am trying to display a table filled with data from collection of models. That in itself is not a problem, however I would like to force razor to generate it always in 3 columns (no matter how many elements we have). My original idea was to do it that way:

 <table class="projects-grid">
    <tr>
    @for(int i = 0; i< Model.Count(); i++) 
     {
         if (i != 0 && i % 3 == 0) 
         {
             Html.Raw("</tr><tr>");
         }
        var item = Model.ElementAt(i);
        <td class="project-tile"> 
            @Html.DisplayFor(modelItem => item.Title)                
        </td>        
    }
    </tr>    
</table>

So in essence every third element I would like Razor to output "" string to add another row to the table. All seems to work fine other than this sting is not present in page source. In debug I can see that this line

 Html.Raw("</tr><tr>");

Is actually called, but no output in generated page is present.

Any help? Many thanks in advance....

回答1:

The reason it's not outputing is because of the context of the razor syntax being executed. In your if block, all code runs as if you were in a regular C# context and the line:

Html.Raw("</tr><tr>");

Returns an MvcHtmlString but you are not doing anything with it. You need to enter an output context:

@Html.Raw("</tr><tr>");


回答2:

I would use a work around.

Try:

<table class="projects-grid">
    <tr>
    @for(int i = 0; i< Model.Count(); i++) 
     {
         if (i != 0 && i % 3 == 0) 
         {
             <text>
             @Html.Raw("</tr><tr>")
             </text>
         }
        var item = Model.ElementAt(i);
        <td class="project-tile"> 
            @Html.DisplayFor(modelItem => item.Title)                
        </td>        
    }
    </tr>    
</table>

Hope it helps.



回答3:

Html.Raw actually used for line break like what you do in c# using /n

For Example:

<text>
@html.raw("</tr><tr>")
</text>

I hope it helps.



回答4:

Html.Raw

Wraps HTML markup in an HtmlString instance so that it is interpreted as HTML markup. For Example :

Controller

public actionresult Htmlraw()
{
    viewbag.message = "Hey friends lets go" + "<br />" + "for chillout";
    return view();
}

output

@html.raw(viewbag.message);


回答5:

Enclosing Html.Raw with @( and ) solved the issue for me. Eventhough there were outer @{ and } , it still needed @( and ) around each Html.Raw statement.