Может быть, есть более простой способ сделать это, и я весь внимание, если есть. Моя ситуация: у меня есть раскрывающийся список в форме, которую я успешно заполняю текстом и значениями. Мне также нужно иметь дополнительные связанные строковые значения из той же строки таблицы в таблице db, доступные на клиенте, поэтому, когда пользователь выбирает из раскрывающегося списка, эти связанные данные заполняются в текстовом поле в форме. Есть только 4 записи, с которыми я имею дело, поэтому хранение на клиенте не имеет большого значения. Я подумал о передаче этих данных через ViewData в виде списка и загрузке в массив javascript. Когда пользователь выбирает из раскрывающегося списка, я определяю выбранный индекс и получаю необходимые данные из массива. Я уже использую значение раскрывающегося списка для других необходимых данных, поэтому мне нужен способ получить эти связанные данные, не возвращаясь на сервер. Если я на правильном пути, может ли кто-нибудь опубликовать простой пример заполнения массива js значениями sting, возвращаемыми в виде списка в ViewData.
Спасибо,
Майк
Ответ 1 · рейтинг 7 · roryf
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