Я прочитал ссылки, указанные при создании этого вопроса.Я думаю, что я пытаюсь сделать немного отличается.Я использую ASP.NET MVC 2.
Извинения за входящую стену текста.Самый короткий способ, которым я могу подумать, чтобы задать этот вопрос, находится сразу ниже.После этого я перехожу к большей части вопроса «почему» и «как» вопроса.
[ОЧЕНЬ БЫСТРЫЙ ПУНКТ ВОПРОСА] Как вернуть словарь как результат JSON от действия и какой jquery / javascript можно использоватьв событии onLoad раскрывающихся списков найти этот JSON для именованного элемента и, если он найден, вернуть соответствующее значение и предварительно выбрать это значение в раскрывающемся списке?
[ПРЕДПОСЫЛКИ] Яработа над созданием проекта для работы, где пользователь выбирает вариант из 2 начальных выпадающих.Первая капля содержит список имен файлов PDF.Второй выпадающий список содержит список запросов к базе данных, связанных с псевдонимом (они не видят sql ... они видят имя соответствующей хранимой процедуры или представления).После того, как пользователь сделал эти 2 выбора, страница перезагружается со многими другими раскрывающимися списками внизу в 2 столбцах.
В левом столбце находится список раскрывающихся списков, которые содержат одинаковое содержание: список иментекстовые поля, содержащиеся в выбранном PDF-файле (я использую программное обеспечение CeTe Dynamic PDF для обработки PDF-взаимодействия).В правом столбце будет список выпадающих, содержащих имена полей выбранного запроса.Оба столбца будут иметь одинаковое количество раскрывающихся списков;общее количество будет количеством полей в PDF.
[ПРОБЛЕМА] Я могу загрузить страницу в порядке и заполнить раскрывающиеся списки с их соответствующими данными.Проблема возникает после нажатия кнопки отправки и публикации данных.Поскольку раскрывающиеся списки создаются динамически, я использую соглашение об именах, чтобы связать, какие выборки принадлежат полям PDF, а какие - полям БД.На стороне действия я перебираю FormCollection и создаю словарь, в котором ключ - это имя отправленного элемента, а значение - это значение отправленного элемента.Я добавляю записи в словарь только для элементов, которые имеют ненулевое, непустое значение.
Пока у меня все это работает.Моя проблема, как вы, наверное, уже догадались, заключается в том, чтобы поддерживать выбор, когда страница возвращается из действия обратно в представление.У меня есть действительно изуродованный код, который близок, но, вероятно, далеко от хорошего решения.
Я опубликую код, который имеет смысл, ниже.У меня есть еще одна идея, которую я не имею ни малейшего понятия о том, как это сделать, - поместить функцию в событие onLoad выпадающих списков, перейти к действию json и отправить сообщения с именем выпадающего списка, вызывающего действие / скрипт.(что бы это ни было).Если представленное имя существует в словаре, где я храню ранее представленные имена и значения из раскрывающихся списков, возвращается соответствующее значение, которое должно быть предварительно выбрано;в противном случае ничего не возвращается и ни одно из значений раскрывающегося списка не выбрано заранее.
Я не знаю много о JSON, но если бы я мог вернуть ранее опубликованный словарь имя / значение в качестве результата JSON на страницуЯ мог бы использовать jquery для анализа json и обработки предварительного выбора, где это необходимо, в раскрывающемся списке.
См. Мой текущий код ниже.Это можно эмулировать, просто создав данные-заглушки для списков SelectItemLists, если вам это интересно.В настоящее время проблема заключается в том, что независимо от того, какой элемент фамилии / значения находится в предварительно выбранном словаре, он выбирается для остальной части списка раскрывающихся списков.
Пример:
Выбранные значения:
A FirstName
B LastName
C SSN
<no selection> <no selection>
<no selection> <no selection>
<no selection> <no selection>
<no selection> <no selection>
Если приведено выше, результат будет следующим:
A FirstName
B LastName
C SSN
C SSN
C SSN
C SSN
C SSN
Текущий код:
<% using (Html.BeginForm()) { %>
<%
List<SelectListItem> mainPdfFieldNames = (List<SelectListItem>)ViewData["PdfFieldNames"];
List<SelectListItem> mainDbFieldNames = (List<SelectListItem>)ViewData["DbFieldNames"];
Dictionary<String, String> fieldValue = (Dictionary<string, string>)ViewData["selectedFieldValues"] ?? new Dictionary<string, string>();
%>
<% for (int i = 0; i < mainPdfFieldNames.Count; i++)
{
String pdfPreselectValue = string.Empty;
String dbPreselectValue = string.Empty;
fieldValue.TryGetValue("PdfFieldNames" + i.ToString(), out pdfPreselectValue);
fieldValue.TryGetValue("DbFieldNames" + i.ToString(), out dbPreselectValue);
IDictionary<string, object> pdfHtmlAttrib = new Dictionary<string, object>();
IDictionary<string, object> dbHtmlAttrib = new Dictionary<string, object>();
List<SelectListItem> pdfFieldNames = mainPdfFieldNames;
List<SelectListItem> dbFieldNames = mainDbFieldNames;
%>
<%= Html.Encode(" PDF Selected value: " + pdfPreselectValue ) %>
<%= Html.Encode(" DB Selected value: " + dbPreselectValue) %>
<%
if (!String.IsNullOrEmpty(pdfPreselectValue))
{
pdfFieldNames.Find(p => p.Value.Equals(pdfPreselectValue)).Selected = true;
pdfHtmlAttrib.Add("selected", null);
}
if (!String.IsNullOrEmpty(dbPreselectValue))
{
dbFieldNames.Find(p => p.Value.Equals(dbPreselectValue)).Selected = true;
dbHtmlAttrib.Add("selected", null);
}
%>
Select PDF Field: <%=Html.DropDownList("PdfFieldNames" + i.ToString(), pdfFieldNames, "Select PDF Field", pdfHtmlAttrib)%>
Select Database Field: <%=Html.DropDownList("DbFieldNames" + i.ToString(), dbFieldNames, "Select Database Field", dbHtmlAttrib)%>
<br />
<%
}%>
<input type="submit" value="Submit" />
<% } %>
ОСНОВНОЕ РЕДАКТИРОВАНИЕ 1 Пропущено для создания комнаты для решения
Я решил пойти другим путем с этим.Я думаю, что это может быть более упрощенным в конце.После просмотра сообщений в действии я создаю строковую переменную из словаря, который ранее использовал.Эта строка помещается в ViewData и на странице скрытое поле.У меня есть функция JavaScript, которая захватывает это поле и анализирует его.Поле nameValue имеет формат «fieldname, fieldvalue; fieldname, fieldvalue; fieldname, fieldvalue».
Ниже выложен тестовый код.На самом деле это полная HTML-страница, которую я использую для разработки этого процесса постепенно.Моя единственная оставшаяся проблема - запуск кода после загрузки страницы.Этот код выберет все раскрывающиеся списки на странице, перебирает их и передает имя раскрывающегося списка созданной мной функции, которая обрабатывает предварительный выбор значения в раскрывающемся списке на основе его имени и наличия этого именив скрытом поле nameValue на странице.