MVC3 Razor removes script tags from HtmlString
I have a method that adds javascript to the end of partial views if it's an ajax request. My problem though is that when the script is returned, the script tags 开发者_如何学Gohave been removed and the function I want to execute is written in plain text.
if (httpContext.Request.IsAjaxRequest())
{
script = "MyNamespace.globals.initFunctions.push(function() { " + script + " });";
return new HtmlString(@"<script type=""text/javascript"">" + script + "</script>");
}
So, instead of getting the desired result of
<script type="text/javascript">MyNamespace.globals.initFunctions.push(function() { MyNamespace.init(); });</script>
I get MyNamespace.globals.initFunctions.push(function() { MyNamespace.init(); });
in plain text.
What could be the reason?
Edit:
Trying it with Html.Raw() did not help. While the script string does contain the script tags, they are still removed when rendered.
@{
string script = ViewUtilities.AddScript("MyNamespace.init();", this.ViewContext.HttpContext);
}
@Html.Raw(script);
Edit 2:
Now I've tried writing it all in the view like this,
<script type="text/javascript">
MyNamespace.globals.initFunctions.push(function() { MyNamespace.init(); });
</script>
and it still removes the tags around the script and renders it as plain text. I don't know where to go from here...
When I exam the response with Firebug it looks fine but looking at the html it's not.
The HTML is being encoded which happens auto-magically with ASP.NET MVC.
Using @Html.Raw("htmlstring")
should give you the raw HTML value of the string without stripping the tags.
You want to use @Html.Raw(whatever function you call)
I think you also probably want to return return MvcHtmlString.Create(fullscript)
;
If you convert this to an HtmlHelper method, it will work. Change your ViewUtilities
class as follows:
public static class ViewUtilities
{
public static MvcHtmlString AddScript(this HtmlHelper htmlHelper, string script)
{
if (htmlHelper.ViewContext.HttpContext.Request.IsAjaxRequest())
return new MvcHtmlString(@"<script type=""text/javascript"">" + script + "</script>");
return new MvcHtmlString("");
}
}
Then, in the web.config
file in the Views
folder (and in any Views folders in any Areas), add the following to the namespaces
list in the <pages pageBaseType="System.Web.Mvc.WebViewPage">
element:
<add namespace="{namespace where ViewUtilities class is located}"/>
Finally, in your view:
@Html.AddScript("MyNamespace.init();")
精彩评论