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 просто разделите строку на основе вашего символа сперва (в данном случае ";" )