2013-01-23 17 views
11

Trước hết, bài viết duy nhất (calling-multiple-dopostback-from-javascript) Tôi tìm thấy về điều này không giúp được vấn đề của tôi, vì vậy tôi không tin rằng bài đăng này là một bản sao.JavaScript: Nhiều thông số trong __doPostBack

Tôi có hàm JavaScript này trong trang web ASPX của tôi bao gồm một chức năng __doPostBack:

function OpenSubTable(bolID, controlID) { 
    // code 
    __doPostBack('UpdatePanelSearch', bolID); 
    // more code 
} 

trình một cách hoàn hảo và tôi có thể nhận được giá trị của bolID vào mã của tôi đằng sau như thế này:

protected void UpdatePanelSearch_Load(object sender, EventArgs e) 
{ 
    var bolID = Request["__EVENTARGUMENT"]; 
    // code 
} 

Vấn đề là, tôi phải vượt qua 2 giá trị khác nhau thông qua postback. Có giải pháp đơn giản nào cho việc này không? Rõ ràng một cái gì đó như thế này không hoạt động:

function OpenSubTable(bolID, controlID) { 
    // code 
    __doPostBack('UpdatePanelSearch', bolID, controlID); // not that simple, i'm afraid :(
    // more code 
} 

Mọi trợ giúp sẽ được chào đón nhiều nhất.

Kính trọng, Gunnar

+0

@jbabey có thể có câu trả lời dễ nhất, nhưng cũng không khó để cuộn chức năng "doPostBack" của riêng bạn.Tất cả những gì cần làm là đặt giá trị của một vài trường nhập ẩn và sau đó gửi biểu mẫu. Rất dễ dàng, ngay cả đối với người mới bắt đầu. – JDB

+0

@ Cyborgx37 có, các đầu vào bị ẩn là tùy chọn tôi sẽ theo đuổi nếu (vì một số lý do lạ) JSON không nằm trong câu hỏi. Nói chung, bạn không muốn làm lộn xộn HTML của mình với các đầu vào bị ẩn trừ khi bạn hoàn toàn phải thực hiện. – jbabey

+0

@jbabey Bạn có thể sử dụng jQuery để tạo các trường trong DOM khi cần. Giữ sạch HTML của bạn. Ngoài ra, bạn có thể đặt các giá trị trong URL, nhưng tôi thường cau mày về cách tiếp cận đó cho một yêu cầu POST (đó là những gì mà WebForms thường sử dụng). Cách tiếp cận của bạn vẫn có thể là một trong những tôi muốn giới thiệu. – JDB

Trả lời

12

Bạn có thể vượt qua hai giá trị là chuỗi một JSON:

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

Và sau đó phân tích nó trên máy chủ:

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; } 
} 

Nếu bạn đang sử dụng .Net> = 4.0, tôi tin rằng bạn có thể deserialize đến một touple chung và tránh phải tạo SomeDTO. Chỉnh sửa: More information about deserializing to dynamic types.

+0

Điều này làm việc như một say mê, cảm ơn. Tôi phải xem xét kỹ hơn JSON, chưa bao giờ sử dụng nó trong các dự án của tôi cho đến bây giờ. Ngoài ra, tôi không có [Newtonsoft.Json framework] (http://nuget.org/packages/newtonsoft.json) được cài đặt trong VS của tôi, nhưng đó là một sửa chữa dễ dàng. – Gunnar

2

Tôi đã sử dụng nhiều thông số trước bằng cách xây dựng và tách một chuỗi.

ví dụ

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

Sau đó, bạn có thể chuyển thông tin này vào lý luận về sự postback, và khi kiểm tra cho các đối số postback chỉ chia chuỗi dựa trên nhân vật speration của bạn (trong trường hợp này ';')

+1

Bạn đang thực hiện 'String.Format' trong javascript như thế nào? : P – jbabey

+0

Im không, phía máy chủ C# của nó, sẵn sàng để được lưu trữ trong một lĩnh vực ẩn, phương pháp web hoặc được chuyển đổi sang javascript. Chỉ cần và ví dụ :) – WraithNath

3

Cân nhắc đặt dữ liệu của bạn vào các trường ẩn phía máy chủ và sau đó đọc dữ liệu đó sau khi đăng lại.

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

Tập lệnh khách hàng của bạn nên bao gồm giá trị ClientID để xử lý sửa đổi vùng chứa tên máy chủ. Sử dụng cú pháp <%= expression %> (Trình tạo biểu thức) yêu cầu tập lệnh của bạn (hoặc ít nhất là phần này của tập lệnh) phải được duy trì trong tệp .aspx của bạn. Nếu bạn duy trì JavaScript của mình trong các tệp bên ngoài, bạn có thể "đăng ký" một hàm đơn giản được gọi bằng JavaScript chính của bạn để di chuyển dữ liệu và soạn bên máy chủ chức năng đó cùng với yêu cầu ClientIDs. Xem ClientScriptManager.RegisterClientScriptBlock().

var data1 = "data value 1"; 
var data2 = "data value 2"; 
$("#<%= Data1HiddenField.ClientID %>").val(data1); 
$("#<%= Data2HiddenField.ClientID %>").val(data2); 

mã phía máy chủ của bạn sau đó trông như thế này:

string data1 = Data1HiddenField.Value; 
string data2 = Data2HiddenField.Value; 

Chắc chắn có kỹ thuật khác để chuyển nhiều giá trị dữ liệu nhưng tôi đã tìm thấy điều này là cả hai đơn giản và dễ dàng để duy trì. Bạn có thể chuyển tất cả các loại dữ liệu và mã hóa nó bằng JSON nếu cần.