2010-10-03 41 views
43

tôi có thể vượt qua một biến từ MVC ASP.NET bằng cách sử dụng này: tốtTruyền mảng từ MVC sang javascript?

var lastCategoryId = '<%=Model.CS.LastSelectedCategory %>'; 

Công việc này với chuỗi hoặc số nguyên nhưng làm thế nào để tôi làm với một mảng của chuỗi? Tôi đã cố gắng vượt qua mảng giống như vậy nhưng biến được đặt thành System.String []?

Trả lời

14

này nên làm

var someArray=[<%foreach (var s in myStringArray){%>'<%=s%>',<%}%>]; 
+0

bạn phải loại bỏ dấu phẩy cuối cùng – Omu

+1

@Omu: Không nhất thiết. Trình phân tích cú pháp Javascript rất tha thứ trong khu vực đó. Tất cả các trình duyệt phổ biến đều không bận tâm về dấu phẩy trong mảng. –

+0

mát mẻ, giống như trong C# – Omu

2

Bạn cần định dạng mảng thành cú pháp mảng JavaScript.

var someArray = [<%= Model.SomeArray.Select(x => "'" + x +"'") 
          .Aggregate((x,y) => x + ", " + y); %>]; 

Điều này sẽ bao quanh mỗi mục nhập bằng dấu ngoặc đơn và sau đó ghép chúng với dấu phẩy giữa dấu ngoặc vuông.

Đã cập nhật: đã xóa dấu ngoặc đơn thừa.

+0

Xin lỗi nhưng tôi nhận được ngoại lệ sau đây với giải pháp này =) dự kiến ​​ – Banshee

+0

Tôi đã có một ngoặc thêm. Tôi đã gỡ bỏ nó. thử ngay bây giờ. –

3

một cái gì đó như thế này:

<script type="text/javascript"> 
var myArr = [<%=string.Join(",", strArr.Select(o => "\"" + o + "\"")) %>]; 
</script> 
+0

+1 cho là sạch nhất, hầu hết các điểm – STW

+0

Vấn đề với điều này là nó không quấn các giá trị chuỗi trong dấu ngoặc kép mà sẽ gây ra một lỗi JavaScript. –

+0

@Matthew Manela thanx vì đã nói với tôi rằng, hãy sửa nó – Omu

43

Bạn có thể JSON serialize nó. Bằng cách này có thể có thể vượt qua thậm chí giá trị phức tạp hơn và không lo lắng về việc thoát dấu ngoặc kép đơn giản, dấu ngoặc kép, vv:

var categoriesList = <%= new JavaScriptSerializer().Serialize(new[] { "value1", "value2" }) %>; 

Viết một helper HTML để làm điều này sẽ tốt hơn:

public static class HtmlExtensions 
{ 
    public static string JsonSerialize(this HtmlHelper htmlHelper, object value) 
    { 
     return new JavaScriptSerializer().Serialize(value); 
    } 
} 

và sau đó trong chế độ xem của bạn:

<script type="text/javascript"> 
    var categoriesList = <%= Html.JsonSerialize(new[] { "value1", "value2" }) %>; 
</script> 
+6

Tôi phải thừa nhận đó là một cách tiếp cận sạch hơn nhiều so với câu trả lời của tôi. Điều này nên được bình chọn là giải pháp, chứ không phải là bài viết của tôi. –

+2

@Adrian, mọi thứ đều chủ quan. Cá nhân tôi ghét nhìn thấy C# trong lượt xem. Và tôi đặc biệt dị ứng với vòng trong quan điểm :-) Cũng không mã hóa các chuỗi của bạn là outputting là cực kỳ nguy hiểm và chịu sự tấn công XSS. Đó là lý do tại sao tôi luôn luôn dựa vào những thứ được xây dựng trong khuôn khổ để tôi không phải lo lắng về việc thoát đúng cách, ... –

+1

Mỗi lần tôi thấy Darin Dimitrov trả lời một câu hỏi, tôi biết tôi sẽ có một giải pháp. Cảm ơn! –

122

Bạn có thể để .NET xử lý tất cả việc nâng hạng nặng cho bạn với dòng mã đơn giản này.

Giả sử bạn đang sử dụng cú pháp MVC Razor.

var yourJavaScriptArray = @Html.Raw(Json.Encode(Model.YourDotNetArray));

Đối với các phiên bản mới hơn của MVC, sử dụng:

var yourJavaScriptArray = @Html.Raw(Json.Serialize(Model.YourDotNetArray));

+4

+1 Rực rỡ, rất sạch sẽ. – twoleggedhorse

+0

cung cấp cho người đàn ông này nhiều hơn upvotes! – mmcrae

+0

Điều này thật tuyệt vời! Không biết điều này đã được hỗ trợ trong Razor, vì vậy darn tốt! – Hajjat

0

Chỉ muốn cung cấp một câu trả lời sử dụng Razor cú pháp:

Chúng tôi có một Dictionary<int, int> rằng chúng ta đang render cho một Sparkline jQuery, dưới dạng "mảng mảng".

var usageData = [ @string.Join(",", Model.UsageData.Select(d => string.Format("[{0},{1}]", d.Key, d.Value)).ToArray()) ]; 

nào được sử dụng như sau:

$('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips }); 

Đây là những gì chúng tôi nhận được khi xem source:

var usageData = [ [-13,0],[-12,1],[-11,0],[-10,0],[-9,1],[-8,1],[-7,0],[-6,2],[-5,2],[-4,0],[-3,0],[-2,9],[-1,3],[0,4] ]; 
$('#sparkline').UsageSparkline(usageData, { tooltipFormatter: cachedTooltips }); 
2

Một lót:

var data = [@Html.Raw(String.Join(",", Model.MyArray.Select(i => "'" + i + "'")))]; 
2

Vì vậy, dễ dàng, s o đơn giản

<script type="text/javascript"> 
    var array = @Html.Raw(
     Json.Encode(
      (Model).Select(m=> new 
      { 
       id= m.ID, 
       name=m.Name 
      }) 
     ) 
    ); 
</script> 

Output là:

[{"id":1,"name":"Name of 1"}, {"id":2,"name":"Name of 2"}, ...]; 
1

Sử dụng Json.NET

var yourlist = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(Model.YourList))'); 
Các vấn đề liên quan