web-dev-qa-db-ja.com

JavaScript:__ doPostBackの複数のパラメーター

まず第一に、これについて私が見つけた唯一の投稿( calling-multiple-dopostback-from-javascript )は私の問題を助けなかったので、この投稿が重複しているとは思わない。

ASPX Webページに__doPostBack関数を含む次のJavaScript関数があります:

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
}

どんな助けでも大歓迎です。

よろしく、グンナー

13
Gunnar

2つの値を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を作成する必要をなくすことができると思います。編集: 動的型への逆シリアル化に関する詳細情報

13
jbabey

サーバー側の非表示フィールドにデータを配置し、ポストバック後にそのデータを読み取ることを検討してください。

_<asp:HiddenField id="Data1HiddenField" runat="server" />
<asp:HiddenField id="Data2HiddenField" runat="server" />
_

クライアントスクリプトには、サーバー側のネーミングコンテナの変更を処理するためのClientID値を含める必要があります。 _<%= expression %>_構文(Expression Builder)を使用するには、スクリプト(または少なくともスクリプトのこの部分)を_.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
andleer

以前、文字列を作成して分割することにより、複数のパラメータを使用しました。

例えば

string args = String.Format("{0};{1}", bolID, ControlID);

次に、これをポストバックの引数に渡すことができます。ポストバック引数をチェックするときは、スペレーション文字(この場合は ';')に基づいて文字列を分割するだけです。

2
WraithNath