2009-09-24 8 views
23

ASP.NET MVCビューでJavaScriptをエスケープするユーティリティ関数はありますか?私はしばしば、ビューからいくつかの値を使って少しのJavaScriptのスニペットを初期化する必要があります。ビューのJavaScript文字列リテラルをエスケープする

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Html.JavaScriptEscape(Model.UserName) %>" }); 
page.init(); 
</script> 

私は、当然のことながら、機能を自分で書くことができます:私はのようなものを期待する

<script type="text/javascript"> 
var page = new Page({ currentUser: "<%= Model.UserName %>" }); 
page.init(); 
</script> 

:例えば私のようなものであってもよいです。しかし、すでに組み込みのユーティリティがHTMLエンコーディングを形成しているので、ASP.NET MVCのセールスポイントの1つは<%>がデフォルトのレンダリングモードであり、私が達成しようとしていることはかなり一般的ですなぜ私はすでにそれが内蔵されているようなものを見つけることができないのだろうかと思う。たとえば、オブジェクトをビューで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); 
     } 
    } 
} 

、それは使用することができる:.NET 4で

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

、HttpUtilityクラスの静的符号化方法の多様を有しますこの特定の目的のためにJavaScriptStringEncodeメソッドを含む様々なコンテキスト。

JSONの逆シリアル化を使用するほうが簡単な場合がよくあります。カミソリテンプレートを使用してMVC 5では

7

、以下が可能です:私の場合は

<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)を数値として残します。これは必要に応じてfloat、decimalなどを含むようにオーバーロードされる可能性があります。

var serverName = @ToJS(m.ServerName); 
var appSiteUrl = @ToJS(m.SiteUrl); 
var facebookId = @ToJS(m.FacebookAppId); 

だから、私はそれについて考えるか、種類ごとに異なる何もする必要はありません

関連する問題