Asp.net mvc 在视图中转义JavaScript字符串文本
ASP.NET MVC视图中是否有转义JavaScript的实用程序函数?我经常需要使用视图中的一些值初始化一小段JavaScript;例如,我可能会有类似于:Asp.net mvc 在视图中转义JavaScript字符串文本,asp.net-mvc,Asp.net Mvc,ASP.NET MVC视图中是否有转义JavaScript的实用程序函数?我经常需要使用视图中的一些值初始化一小段JavaScript;例如,我可能会有类似于: <script type="text/javascript"> var page = new Page({ currentUser: "<%= Model.UserName %>" }); page.init(); </script> <script type="text/javascript
<script type="text/javascript">
var page = new Page({ currentUser: "<%= Model.UserName %>" });
page.init();
</script>
<script type="text/javascript">
var page = new Page({ currentUser: "<%= Html.JavaScriptEscape(Model.UserName) %>" });
page.init();
</script>
var page=新页面({currentUser:”“});
page.init();
我希望有这样的情况:
<script type="text/javascript">
var page = new Page({ currentUser: "<%= Model.UserName %>" });
page.init();
</script>
<script type="text/javascript">
var page = new Page({ currentUser: "<%= Html.JavaScriptEscape(Model.UserName) %>" });
page.init();
</script>
var page=新页面({currentUser:”“});
page.init();
当然,我可以自己编写函数。但是既然已经有了内置的HTML编码实用程序,而且ASP.NET MVC的一个卖点是默认的呈现模式,而且我尝试实现的是非常常见的,这让我想知道为什么我找不到类似的内置模式。例如,是否有一种简单而优雅的方法可以在视图中将对象序列化为JSON
还是我在做违背ASP.NET MVC原则的事情?当我遇到这样的问题时,它通常会让它认为我做错了什么,因为我假设框架设计师花了一些时间思考现实世界中的场景。在ASP.NET MVC中工作了一段时间后,我得出结论(很可能)它没有内置帮助程序。当然,写你自己的也很简单。为了完整起见,这里是:
using System.Web.Mvc;
using System.Web.Script.Serialization;
namespace MyProject.Helpers
{
public static class JsonExtensions
{
public static string Json(this HtmlHelper html, object obj)
{
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
return jsonSerializer.Serialize(obj);
}
}
}
在视图中,它可以按如下方式使用:
<script type="text/javascript">
var page = new Page(<%= Html.Json(new { currentUser: Model.UserName } ) %>);
page.init();
</script>
var page=新页面();
page.init();
在.NET 4中,HttpUtility类具有用于各种上下文的各种静态编码方法,包括用于此特定目的的方法
不过,只使用JSON反序列化通常更简单。在使用Razor模板的MVC 5中,以下是可能的:
<script type="text/javascript">
var page = new Page({ currentUser: @Html.Raw(Json.Encode(Model.UserName)) });
page.init();
</script>
var page=新页面({currentUser:@Html.Raw(Json.Encode(Model.UserName))});
page.init();
在我的例子中,我需要一个字符串而不是json对象,这是针对Asp.Net核心的:
@functions{
public Microsoft.AspNetCore.Html.IHtmlContent ToJS(string value)
{
return Html.Raw("'" + value.Replace("'", "\\'").Replace("\r", "\\r").Replace("\n", "\\n") + "'");
}
public Microsoft.AspNetCore.Html.IHtmlContent ToJS(int value)
{
return Html.Raw("" + value);
}
}
这将转义“”和行尾字符。它还将数字(int)保留为一个数字。这可以根据需要重载以包括浮点、十进制等
因此,我不必考虑它,也不必为每种类型做任何不同的事情:
var serverName = @ToJS(m.ServerName);
var appSiteUrl = @ToJS(m.SiteUrl);
var facebookId = @ToJS(m.FacebookAppId);