2010-10-03 2 views
43

я могу передать переменную из MVC ASP.NET с помощью этого:Pass Array от MVC до javascript?

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

Это отлично работает со строкой или целым числом, но, как мне делать с массивом строк? Я попытался передать массив таким же образом, но переменная установлена ​​в System.String []?

ответ

14

Это должно сделать

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

вам нужно избавиться от последней запятой – Omu

+1

@Omu: Не обязательно. Анализаторы Javascript очень прощают в этой области. Все обычные браузеры не возражают против конечных запятых в массивах. –

+0

круто, как и в C# – Omu

2

Вам нужно отформатировать массив в синтаксисе массива JavaScript.

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

Это будет охватывать каждую запись одинарными кавычками, а затем присоединяться к ним вместе с запятыми между квадратными скобками.

Обновлено: удалены дополнительные скобки.

+0

Извините, но я получаю следующее исключение с этим решением =) ожидается – Banshee

+0

я была лишняя скобка. Я удалил его. попробуй. –

3

что-то вроде этого:

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

+1 за то, что он самый чистый, самый точный – STW

+0

Проблема с этим заключается в том, что он не переносит строковые значения в кавычки, которые могут вызвать ошибку JavaScript. –

+0

@Matthew Manela thanx за то, что сказал мне это, исправил его – Omu

43

Вы можете JSON сериализации его. Таким образом, может может пройти еще более сложные значения и не беспокоиться о побеге простые кавычки, двойные кавычки и т.д.:

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

написание HTML-помощника, чтобы сделать это было бы еще лучше:

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

, а затем на ваш взгляд:

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

Я должен признать, что это гораздо более чистый подход, чем мой ответ. Это должно рассматриваться как решение, а не мое сообщение. –

+2

@Adrian, все субъективно. Лично я ненавижу видеть C# в представлениях. И у меня особенно аллергия на циклы во взглядах :-) Также не кодирование строк, которые вы выводите, чрезвычайно опасно и подвержено атакам XSS. Вот почему я предпочитаю всегда полагаться на вещи, встроенные в структуру, так что мне не нужно беспокоиться о том, чтобы правильно сбежать, ... –

+1

Каждый раз, когда я вижу, что Дарин Димитров отвечает на вопрос, я знаю, что у меня будет решение. Благодаря! –

122

Вы можете позволить .NET обрабатывать весь тяжелый подъем для вас с помощью этой простой строки кода.

Предполагается, что вы используете синтаксис MVC Razor.

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

Для более новых версий MVC, использование:

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

+4

+1 Блестящий, очень чистый. – twoleggedhorse

+0

дайте этому человеку больше upvotes! – mmcrae

+0

Это потрясающе! Не знал, что это было поддержано в Razor, так что чертовски хорошо! – Hajjat

0

Просто хотел дать ответ, используя Razor синтаксис:

У нас есть Dictionary<int, int>, что мы рендеринга для jQuery Sparkline, в виде «массива массивов».

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

Который используется следующим образом:

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

Это то, что мы получаем при просмотре источника:

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

Один лайнер:

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

Так легко, с о простой

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

Выход:

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

Использование Json.NET

var yourlist = JSON.parse('@Html.Raw(JsonConvert.SerializeObject(Model.YourList))'); 
Смежные вопросы