How to make MVC 4 Razor Html.Raw work for assignment in HTML within script tags

Posted by Yarune on Stack Overflow See other posts from Stack Overflow or by Yarune
Published on 2012-11-28T13:05:45Z Indexed on 2012/11/28 17:05 UTC
Read the original article Hit count: 411

Filed under:
|
|

For a project I'm using jqote for templating in JavaScript and HTML generated by MVC 4 with Razor.

Please have a look at the following code in HTML and Razor:

<script id="testTemplate" type="text/html">
    <p>Some html</p>
    @{string id = "<%=this.Id%>";}

    <!-- 1 -->
    @if(true) 
    {   
        @Html.Raw(@"<select id="""+id+@"""></select>")
    }
    <!-- 2 -->
    @if(true)
    {
        <select id="@Html.Raw(id)"></select>
    }
    <!-- 3 -->
    @Html.Raw(@"<select id="""+id+@"""></select>")
    <!-- 4 -->
    <select id="@Html.Raw(id)"></select>
    <!-- 5 -->
    <select id="<%=this.Id%>"></select>
</script>

The output is this:

<script id="testTemplate" type="text/html">
    <!-- 1 -->
    <select id="<%=this.Id%>"></select> <!--Good!-->
    <!-- 2 -->
    <select id="&lt;%=this.Id%&gt;"></select> <!--BAD!-->
    <!-- 3 -->
    <select id="<%=this.Id%>"></select> <!--Good!-->
    <!-- 4 -->
    <select id="<%=this.Id%>"></select> <!--Good!-->
    <!-- 5 -->
    <select id="<%=this.Id%>"></select> <!--Good!-->
</script>

Now, the problem is with the second select under <!-- 2 -->. One would expect the Html.Raw to kick in here but somehow it doesn't. Or Razor wants to HtmlEncode what's in there.

The question is: Does anyone have an idea why? Is this a bug or by design?

Without the script tags it works. But we need the script tags cause we need to template in JavaScript.

Hardcoded it works, but we need to use a variable because this will not always be a template.

Without the @if it works, but it's there, we need it.

Workarounds

These lines give similar good outputs:

@if(true)
{
    <select id= "@Html.Raw(id)"></select>
}
@if(true)
{
    <select id ="@Html.Raw(id)"></select>
}
@if(true)
{
    <select id @Html.Raw("=")"@Html.Raw(id)"></select>
}

We're planning to do this:

<script id="testTemplate" type="text/html">
    @{string id = @"id=""<%=this.Id%>""";}
    @if(true)
    {   
        <select @Html.Raw(id)></select>
    }
</script>

...to keep as to markup intact as much as possible.

© Stack Overflow or respective owner

Related posts about Razor

Related posts about asp.net-mvc-4