Нужен простой пример заполнения массива javascript из списка Viewdata - PullRequest
3 голосов
/ 19 марта 2009

Там может быть более простой способ сделать это, и я все уши, если есть. Моя ситуация - у меня есть выпадающий список в форме, который я успешно заполняю текстом и значениями. Мне также нужно иметь дополнительные связанные значения строк из той же строки таблицы в таблице базы данных, доступные на клиенте, поэтому, когда пользователь выбирает из выпадающего списка, эти связанные данные заполняются в текстовом поле на форме. Есть только 4 записи, с которыми я имею дело, поэтому хранение на клиенте - не проблема. Я думал о передаче этих данных через ViewData в виде списка и загрузки в массив JavaScript. Когда пользователь выбирает из выпадающего списка - я определяю выбранный индекс и получаю необходимые данные из массива. Я уже использую значение раскрывающегося элемента для других необходимых данных, поэтому мне нужен способ получить эти связанные данные, не совершая обратную поездку на сервер. Если я на правильном пути, может кто-нибудь опубликовать простой пример заполнения массива js значениями sting, возвращенными в виде List в ViewData.

Спасибо

Mike

Ответы [ 2 ]

7 голосов
/ 19 марта 2009
var myArray = [
<% foreach (string item in ViewData["list"] as List<string>) { %>
"<%= item %>",
<% } %>
];

Наличие запятой в конце, как сообщается, приведет к разрыву в IE, поэтому я бы предложил использовать вспомогательный метод расширения представления, чтобы упростить управление кодом:

<%= Html.JavaScriptArray(ViewData["list"] as List<string>, "myArray") %>

Поместите этот вспомогательный метод где-нибудь в вашем решении:

public static string JavaScriptArray(this HtmlHelper htmlHelper, IList<string> values, string varName) {
    StringBuilder sb = new StringBuilder("var ");
    sb.append(varName);
    sb.append(" = [");
    for (int i = 0; i < values.Count; i++) {
        sb.append("'");
        sb.append(values[i]);
        sb.append("'");
        sb.append(i == values.Count - 1 ? "\n" : ",\n"); // Not the prettiest but it works...
    }
    sb.append("];");
    return sb.toString();
}

Технически метод расширения может идти куда угодно, вам просто нужно включить пространство имен в ваш файл .aspx. Практически лучше хранить их в логически разделенных классах, таких как MyApp.Mvc.Extensions.JavaScriptExtensions, MyApp.Mvc.Extensions.LinkExtensions

1 голос
/ 20 марта 2009

как насчет ...

<%= new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(ViewData["list"]) %>
...