まず第一に、これについて私が見つけた唯一の投稿( 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
}
どんな助けでも大歓迎です。
よろしく、グンナー
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
を作成する必要をなくすことができると思います。編集: 動的型への逆シリアル化に関する詳細情報 。
サーバー側の非表示フィールドにデータを配置し、ポストバック後にそのデータを読み取ることを検討してください。
_<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を使用してエンコードできます。
以前、文字列を作成して分割することにより、複数のパラメータを使用しました。
例えば
string args = String.Format("{0};{1}", bolID, ControlID);
次に、これをポストバックの引数に渡すことができます。ポストバック引数をチェックするときは、スペレーション文字(この場合は ';')に基づいて文字列を分割するだけです。