2009-09-24 31 views
23

Có chức năng tiện ích nào để thoát JavaScript trong chế độ xem ASP.NET MVC không? Tôi thường cần phải bắt đầu một đoạn mã JavaScript nhỏ bằng cách sử dụng một số giá trị từ chế độ xem; Ví dụ tôi có thể có một cái gì đó như:Thoát các chuỗi ký tự JavaScript trong các khung nhìn

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

Tôi mong chờ một cái gì đó như:

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

tôi có thể, tất nhiên, hãy viết các chức năng bản thân mình. Nhưng vì đã có sẵn các tiện ích tạo mã HTML, và vì một trong những điểm bán hàng của ASP.NET MVC là <%%> là chế độ hiển thị mặc định và vì những gì tôi đang cố gắng đạt được là khá phổ biến , nó làm cho tôi tự hỏi tại sao tôi không thể tìm thấy bất cứ điều gì như thế đã được xây dựng trong. Có, ví dụ, một cách dễ dàng và thanh lịch để serialize một đối tượng để JSON trong quan điểm?

Hoặc đang làm điều gì đó chống lại các nguyên tắc ASP.NET MVC? Khi tôi gặp phải một vấn đề như thế này, nó thường khiến cho tôi nghĩ rằng tôi đang làm điều gì đó sai vì tôi cho rằng các nhà thiết kế khung đã dành thời gian suy nghĩ về các tình huống thực tế.

Trả lời

8

Sau một thời gian làm việc trong ASP.NET MVC, tôi kết luận rằng (rất có thể) không có trình trợ giúp cài sẵn cho nó. Tất nhiên, nó là tầm thường để viết của riêng bạn. Dưới đây là nó vì lợi ích của sự hoàn chỉnh:

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); 
     } 
    } 
} 

Trong một cái nhìn, nó có thể được sử dụng như sau:

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

Trong NET 4, Lớp HttpUtility có một loạt các phương pháp mã hóa tĩnh cho các ngữ cảnh khác nhau, bao gồm phương thức JavaScriptStringEncode cho mục đích cụ thể này.

Tuy nhiên, thường đơn giản hơn khi sử dụng tính năng deserialization JSON.

7

Trong MVC 5 sử dụng Razor mẫu, sau đây là có thể:

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

Trong trường hợp của tôi, tôi cần một chuỗi không phải là một đối tượng JSON và điều này là dành cho Asp.Net Core:

@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); 
    } 
} 

Điều này sẽ thoát khỏi ký tự 'và kết thúc dòng. Ngoài ra nó để lại số (int) như một số. Điều này có thể bị quá tải bao gồm phao, thập phân, v.v. khi cần thiết.

Vì vậy, tôi không cần phải suy nghĩ về nó hoặc làm bất cứ điều gì khác nhau đối với từng loại:

var serverName = @ToJS(m.ServerName); 
var appSiteUrl = @ToJS(m.SiteUrl); 
var facebookId = @ToJS(m.FacebookAppId); 
Các vấn đề liên quan