Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在视图中转义JavaScript字符串文本_Asp.net Mvc - Fatal编程技术网

Asp.net mvc 在视图中转义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

ASP.NET MVC视图中是否有转义JavaScript的实用程序函数?我经常需要使用视图中的一些值初始化一小段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);