2013-01-23 23 views
11

首先,我發現關於此的唯一職位(calling-multiple-dopostback-from-javascript)沒有幫助我的問題,所以我不相信這篇文章是重複的。JavaScript:__doPostBack中的多個參數

我在我的ASPX網頁此JavaScript函數,包括__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 
} 

任何幫助將是最受歡迎的。

問候, 貢納爾

+0

@ jbabey可能有最簡單的答案,但它也不難推出自己的「doPostBack」功能。它所需要做的就是設置一對隱藏輸入字段的值,然後提交表單。非常容易,即使是初學者。 – JDB

+0

@ Cyborgx37是的,隱藏的輸入是我會追求的選項,如果(出於某種奇怪的原因)JSON是不可能的。一般來說,除非你絕對必須,否則你不想用隱藏的輸入來混淆你的HTML。 – jbabey

+0

@jbabey您可以根據需要使用jQuery在DOM中創建字段。保持您的HTML清潔。或者,您可以將值放入URL中,但我通常對該方法對於POST請求(這是WebForms通常使用的方法)不滿。你的方法仍然可能是我推薦的方法。 – JDB

回答

12

你可以通過這兩個值作爲一個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,我相信您可以反序列化爲通用的touple,並避免創建SomeDTO。編輯:More information about deserializing to dynamic types

+0

這工作就像一個魅力,謝謝。我必須仔細看看JSON,直到現在,從未在我的項目中使用它。另外,我沒有在我的VS中安裝[Newtonsoft.Json框架](http://nuget.org/packages/newtonsoft.json),但這是一個簡單的修復。 – Gunnar

2

我以前通過建立和分割字符串中使用多個參數。

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

然後,您可以到論據,回傳通過這一點,並回傳的參數檢查時,根據您的speration角色只是分割字符串(在這種情況下,「;」)

+1

你如何在JavaScript中執行'String.Format'? :P – jbabey

+0

我不是,其C#服務器端,準備存儲在隱藏字段,網絡方法或轉換爲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對其進行編碼。