JavaScript: несколько параметров в __doPostBack
Прежде всего, единственное сообщение (calling-multiple-dopostback-from-javascript), которое я нашел об этом, не помогло моей проблеме, поэтому я не верю, что это сообщение дублировать.
У меня есть эта функция JavaScript на моей веб-странице ASPX, которая включает функцию __doPostBack:
function OpenSubTable(bolID, controlID) {
// code
__doPostBack('UpdatePanelSearch', bolID);
// more code
}
Работает отлично, и я могу получить значение bolID в моем коде, как это:
protected void UpdatePanelSearch_Load(object sender, EventArgs e)
{
var bolID = Request["__EVENTARGUMENT"];
// code
}
Проблема заключается в том, что я должен передать 2 разных значения через обратную передачу. Есть ли простые решения? Очевидно, что-то вроде этого не работает:
function OpenSubTable(bolID, controlID) {
// code
__doPostBack('UpdatePanelSearch', bolID, controlID); // not that simple, i'm afraid :(
// more code
}
Любая помощь будет приветствоваться.
С уважением,
Гуннар
Ответы
Ответ 1
Вы можете передать два значения как одну строку JSON:
function OpenSubTable(bolID, controlID) {
__doPostBack('UpdatePanelSearch', JSON.stringify({ bolID: bolID, controlID: controlID}));
}
И затем проанализируйте его на сервере:
protected void UpdatePanelSearch_Load(object sender, EventArgs e)
{
SomeDTO deserializedArgs =
JsonConvert.DeserializeObject<SomeDTO>(Request["__EVENTARGUMENT"]);
var bolID = deserializedArgs.bolID;
var controlID = deserializedArgs.controlID;
}
public class SomeDTO
{
public string bolID { get; set; }
public string controlID { get; set; }
}
Если вы используете .Net >= 4.0, я считаю, что вы можете десериализовать общий ролик и не создавать SomeDTO
. Изменить: Подробнее о десериализации для динамических типов.
Ответ 2
Рассмотрите возможность размещения ваших данных на скрытых полях на стороне сервера и затем чтение этих данных после обратной передачи.
<asp:HiddenField id="Data1HiddenField" runat="server" />
<asp:HiddenField id="Data2HiddenField" runat="server" />
Ваш клиент script должен включать значения ClientID для обработки модификаций контейнера именования на стороне сервера. Использование синтаксиса <%= expression %>
(Expression Builder) требует, чтобы ваш script (или, по крайней мере, эта часть script) поддерживался в вашем файле .aspx
. Если вы поддерживаете свой JavaScript во внешних файлах, вы можете "зарегистрировать" простую функцию, которая вызывается вашим основным JavaScript для перемещения данных и создания этой функциональной серверной части вместе с требуемым ClientIDs
. См. ClientScriptManager.RegisterClientScriptBlock()
.
var data1 = "data value 1";
var data2 = "data value 2";
$("#<%= Data1HiddenField.ClientID %>").val(data1);
$("#<%= Data2HiddenField.ClientID %>").val(data2);
Код вашей серверной части выглядит следующим образом:
string data1 = Data1HiddenField.Value;
string data2 = Data2HiddenField.Value;
Есть, конечно, другие методы передачи нескольких значений данных, но я нашел, что это было простым и легким в обслуживании. Вы можете передавать все виды данных и кодировать их с помощью JSON, если это необходимо.
Ответ 3
Я использовал несколько параметров раньше, строя и разбивая строку.
например,
string args = String.Format("{0};{1}", bolID, ControlID);
Затем вы можете передать это аргументам для обратной передачи, а при проверке аргументов postback просто разделите строку на основе вашего символа сперва (в данном случае ";" )