2013-01-23 24 views
11

まず、この問題について私が見つけた唯一の投稿(calling-multiple-dopostback-from-javascript)は、私の問題には役に立たなかったので、この投稿は重複していると信じていません。JavaScript:__doPostBackの複数のパラメータ

私は__doPostBack機能が含まれて私のASPXのWebページにこの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 
} 

どのようなヘルプも大歓迎です。

よろしく、 グンナー

+0

@jbabeyはおそらく最も簡単な答えですが、独自の "doPostBack"機能を起動することも難しくありません。いくつかの非表示の入力フィールドの値を設定し、フォームを送信するだけです。非常に簡単、初心者の方でも。 – JDB

+0

@ Cyborgx37はい、隠された入力は私が追求するオプションです(何らかの奇妙な理由で)JSONが問題にならない場合です。一般的に、絶対に必要な場合を除いて、隠された入力であなたのHTMLを混乱させたくありません。 – jbabey

+0

@jbabey jQueryを使用して、必要に応じてDOM内のフィールドを作成できます。 HTMLをきれいに保ちます。代わりに、URLに値を入れることもできますが、私は一般的にPOSTリクエスト(WebFormsが一般的に使用しているもの)のためにそのアプローチに惑わされています。あなたのアプローチはおそらく私が推薦するものです。 – JDB

答えて

12

あなたは1 JSON文字列として2つの値を渡すことができ

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を作成する必要はありません。編集:More information about deserializing to dynamic types

+0

これは魅力のように、ありがとう。私はJSONを詳しく見て、今まで私のプロジェクトでそれを使ったことはありませんでした。また、VSには[Newtonsoft.Json framework](http://nuget.org/packages/newtonsoft.json)がインストールされていませんでしたが、簡単に修正できました。 – Gunnar

2

私は前に構築し、文字列を分割して複数のパラメータを使用していました。

例えば

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

はその後、ポストバックの引数にして、これを渡して、ポストバックの引数をチェックするときに、ちょうどあなたsperation文字に基づいて文字列を分割することができます(この場合は「;」)

function OpenSubTable(bolID, controlID) { 
    __doPostBack('UpdatePanelSearch', JSON.stringify({ bolID: bolID, controlID: controlID})); 
} 

し、サーバー上でそれを解析:

+1

どのように 'String.Format'をJavaScriptで実行していますか? :P – jbabey

+0

Im、そのC#サーバー側、隠しフィールドに格納する準備ができている、WebメソッドまたはJavaScriptに変換する。ちょうど例: – WraithNath

3

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

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

クライアントスクリプトには、サーバー側の名前付けコンテナーの変更を処理するClientID値が含まれている必要があります。 <%= expression %>構文(式ビルダー)を使用するには、スクリプト(または少なくともスクリプトのこの部分)を.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を使用してエンコードすることができます。

関連する問題