Несерверные элементы управления и частичные обратные передачи
Я вставляю некоторые несерверные элементы управления (простые HTML-элементы управления) динамически в панель обновления с помощью jQuery.
Если я выполняю полную обратную передачу, я могу получить значения этих элементов управления, используя Request.Form, однако, если я делаю частичную обратную передачу, я не могу.
Должен ли я быть в состоянии получить значения элементов управления HTML во время частичной обратной передачи? Или только элементы управления с runat="server"?
Я использую не серверные элементы управления, так как я играю с Facebox и элементами управления загрузкой файлов... это не красиво:-|
2 ответа
Панель обновления не является эффективным способом сделать асинхронным.
Поскольку вы уже используете jQuery, добавьте веб-сервис (.asmx) в свой проект и нажмите на него. См. Рисунок 4 этой статьи: http://msdn.microsoft.com/en-us/magazine/cc163413.aspx
Request.Form создается из viewstate, к которому ваши элементы управления не будут добавлены.
Вы можете получить все значения любого элемента управления формы или элементов управления, которые вы хотите в Частичной обратной передаче. Это тривиальный ответ, но на первый взгляд интуитивно не очевидный. Может быть, поэтому ASP.net мертв.
Помните, что параметры
__doPostback(string controlId,string param)
являются строками, а методы ASP.net
Request.Params.Get("__EVENTTARGET"); // id
Request.Params.Get("__EVENTTARGET"); // parameter
возвращать строки
Поэтому простой ответ
Создайте объект javascript с парами ключевых значений всех элементов формы, которые вы хотите отправить обратно в свой фрагмент.
Стригируйте этот объект и передайте его как второй параметр вашего вызова __doPostBack.
На стороне сервера вы просто изменяете этот процесс, чтобы извлечь свой объект и все значения форм, которые вам нужны.
Например:
var strigifiedObject = JSON.stringify(myFormObject);
var id = "partialPostback";
__doPostBack(id, strigifiedObject);
... между тем на стороне сервера
string id = Request.Params.Get("__EVENTTARGET");
string param = Request.Params.Get("__EVENTARGUMENT");
if (id == "partialPostback") {
List<MyObj> formVals = new JavaScriptSerializer().Deserialize<List<MyObj>>>(param);
}