2009-09-24 61 views
23

是否存在用於在ASP.NET MVC視圖中轉義JavaScript的實用程序功能?我經常需要使用視圖中的一些值來初始化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> 

我當然可以,寫函數自己。但是由於已經有內置的實用程序形成了HTML編碼,並且由於ASP.NET MVC的賣點之一就是<%>是默認的渲染模式,並且我試圖實現的功能很常見,這讓我想知道爲什麼我找不到那些已經內置的東西。有沒有,例如,一個簡單而優雅的方式來在視圖中將對象序列化爲JSON?

或者正在對ASP.NET MVC原則做些什麼?當我遇到像這樣的問題時,它通常會讓我覺得要麼我做錯了什麼,因爲我認爲框架設計師花了一些時間思考真實世界的情景。

回答

8

在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> 
47

在.NET 4,HttpUtility類有各種靜態編碼方法對各種背景下,包括用於此特定目的的JavaScriptStringEncode方法。

但是,使用JSON反序列化通常更簡單。

7

在MVC 5使用剃刀模板,以下是可能的:

<script type="text/javascript"> 
    var page = new Page({ currentUser: @Html.Raw(Json.Encode(Model.UserName)) }); 
    page.init(); 
</script> 
0

在我來說,我需要一個字符串不是一個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);