Làm thế nào dữ liệu nên được chuyển giữa mã Javascript và mã C # phía máy khách phía sau ứng dụng ASP.NET?


21

Tôi đang tìm cách truyền dữ liệu hiệu quả / tiêu chuẩn nhất giữa mã JavaScript phía máy khách và mã C # đằng sau một ứng dụng ASP.NET. Tôi đã sử dụng các phương pháp sau để đạt được điều này nhưng tất cả đều cảm thấy hơi khó hiểu.

Để truyền dữ liệu từ JavaScript sang mã C # bằng cách đặt các biến ASP ẩn và kích hoạt một postback:

<asp:HiddenField ID="RandomList" runat="server" />

function SetDataField(data) {
      document.getElementById('<%=RandomList.ClientID%>').value = data;
}

Sau đó, trong mã C # tôi thu thập danh sách:

protected void GetData(object sender, EventArgs e)
{
      var _list = RandomList.value;
}

Quay trở lại theo cách khác, tôi thường sử dụng ScriptManager để đăng ký một hàm và truyền dữ liệu đó trong Page_Load:

ScriptManager.RegisterStartupScript(this.GetType(), "Set","get("Test();",true);

hoặc tôi thêm thuộc tính vào các điều khiển trước khi đăng lại hoặc trong giai đoạn khởi tạo hoặc kết xuất trước:

Btn.Attributes.Add("onclick", "DisplayMessage("Hello");");

Những phương pháp này đã phục vụ tôi tốt và thực hiện công việc, nhưng chúng không cảm thấy hoàn chỉnh. Có cách truyền dữ liệu chuẩn hơn giữa mã phía máy khách JavaScript và mã back-end C # không?

Tôi đã thấy một số bài đăng như thế này mô tả lớp HtmlEuity; đây có phải là cái gì đó tôi nên xem xét?



Nó phụ thuộc vào ý của bạn bằng cách truyền dữ liệu giữa máy chủ và máy khách. Nếu dữ liệu được biết tại thời điểm trang được hiển thị thì việc thêm tập lệnh để tạo dữ liệu của bạn hoặc đặt json thông qua một biến thể bằng chữ hoặc tương tự hoặc khác là hoàn toàn hợp lý. Nếu, OTOH, bạn đang cố gắng có một trang tương tác với máy chủ mà không thực hiện đăng lại thì đó là một vấn đề hoàn toàn khác. Chắc chắn nhìn vào json.
Murph

Ví dụ. Nếu tôi khởi chạy một nút từ máy khách có một số dữ liệu từ tệp xml. Sau đó, một số tính toán được thực hiện trên dữ liệu trong C #. Sau đó, tôi muốn kết quả hoàn thành được hiển thị trong một màn hình đồ họa javascript đẹp. Đó là một postback mà khách hàng không biết kết quả cho đến khi postback đã được nâng lên.
cwc1983

Từ nhận xét đó, bạn vẫn có thể thực hiện tất cả công việc tại máy chủ - tải / xử lý / trả lại - vì vậy, trong trường hợp đầu tiên, tôi sẽ làm điều đó. Định dạng dữ liệu là json, bao gồm json khi bạn kết xuất trang (nghĩa đen sẽ cho phép bạn làm điều này). Khi bạn làm việc đó có thể bạn sẽ muốn làm một cái gì đó không đồng bộ hơn - nhưng nó sẽ giống như vậy.
Murph

Cảm ơn tất cả. Sau khi đọc lời khuyên ở đây và thực hiện một số nghiên cứu bổ sung, tôi đã tìm thấy một phương pháp mới để đạt được những gì tôi muốn làm. Vấn đề chính tôi gặp phải là khi tôi thực hiện một bài viết Ajax tôi không thể lấy mã phía máy khách để nhớ chương trình đang ở đâu. Bây giờ tôi đang sử dụng JQuery $ Ajax.Post vì nó cung cấp một bài đăng Thành công trở lại dữ liệu phiên lưu của máy khách.
cwc1983

Câu trả lời:


9

Bạn có thể đơn giản và dễ dàng gọi một phương thức trang tĩnh từ JavaScript như trong ví dụ này . Nếu bạn cần gọi phương thức từ nhiều trang, bạn có thể thiết lập một dịch vụ web và gọi nó từ Javascript theo cùng một cách. Ví dụ cũng bao gồm dưới đây.

Mã .aspx

<asp:ScriptManager ID="ScriptManager1" 
EnablePageMethods="true" 
EnablePartialRendering="true" runat="server" />

Mã phía sau mã

using System.Web.Services;

[WebMethod]
public static string MyMethod(string name)
{
    return "Hello " + name;
}

Mã Javascript

function test() {
    alert(PageMethods.MyMethod("Paul Hayman"));
}

LƯU Ý: Các phương thức trang phải tĩnh. Điều này có thể là vấn đề đối với bạn, tùy thuộc vào những gì ứng dụng đang cố gắng làm. Tuy nhiên, nếu thông tin hoàn toàn dựa trên phiên và bạn đang sử dụng một loại xác thực tích hợp nào đó, bạn có thể đặt thuộc tính EnableSession trên trình trang trí WebMethod và điều đó sẽ cho phép bạn truy cập tại HttpContext.Cản.User, Phiên, v.v.


Ví dụ tuyệt vời, điều này hoạt động tốt và tôi sẽ sử dụng nó. Cảm ơn!
Mausimo

3

Tôi khuyên bạn nên xem jQuery. JQuery có thể được sử dụng để thực hiện các cuộc gọi AJAX trở lại máy chủ, có thể lấy lại dữ liệu ở bất kỳ định dạng nào bạn cần - một định dạng tốt có thể là JSON, vì nó có thể được sử dụng trực tiếp trong javascript.

Để kéo dữ liệu từ máy chủ xuống javascript bằng jQuery , các lần tìm nạp sau đây đưa ra yêu cầu không đồng bộ tới http://youserver.com/my/uri và nhận dữ liệu từ máy chủ trong chức năng được cung cấp.

$.get("my/uri", 
    function(data) { 
       // client side logic using the data from the server
    })

Gửi dữ liệu từ javascript đến máy chủ hoạt động tương tự:

$.post("my/uri", { aValue : "put any data for the server here" }
    function(data) { 
       // client side logic using the data returned from the server
    })

Cảm ơn, điều này thật tuyệt, nhưng tôi đặc biệt đề cập đến các tình huống trong đó một postback được thực hiện trước khi khách hàng biết những gì sẽ hiển thị. Nếu "kết quả" đạt được thông qua c # thì làm thế nào để tôi "tiêm" lại cho khách hàng.
cwc1983

3

Microsoft đã áp dụng UpdatePanelđiều khiển để thực hiện ajax vì vậy được cho là cách "chuẩn". Cá nhân tôi không khuyên bạn nên sử dụng nó, mặc dù nó không có bộ tính năng phong phú và kiểm soát mà bạn có khi sử dụng JavaScript trực tiếp.

Đây là cách cá nhân tôi làm:

Tạo các trường ẩn cho bất kỳ giá trị phía máy khách nào bạn muốn sử dụng trong một postback trang tiêu chuẩn (tức là khi người dùng nhấn gửi)

<asp:HiddenField ID="selectedProduct" runat="server" />

Trong mã phía sau đăng ký các điều khiển bạn muốn sử dụng phía máy khách.

    /* Register the controls we want to use client side */

    string js = "var productBox = document.getElementById('" + selectedProduct.ClientID + "'); ";
    js += "var macCodeBoxBE = document.getElementById('" + beMacCode.ClientID + "'); ";


    ClientScript.RegisterStartupScript(this.GetType(), "prodBox", js, true);

Sử dụng thư viện javascript * để thực hiện bài đăng / nhận ajax của bạn sau đó sử dụng JavaScript để cập nhật trang dựa trên phản hồi

$.get("../ajax/BTBookAppointment.aspx?dsl=" + telNumberBox.value + "&date=" + requiredDate.value + "&timeslot=" + ddTimeslot.value, function (response, status, xhr) {

    if (response.indexOf("not available") > -1) {
        loaderImage.src = "../images/cross.png"
        output.innerHTML = response;
    } });

Viết một trang "ajax" riêng biệt ghi đè phương thức kết xuất để thực hiện công việc.

protected override void Render(HtmlTextWriter writer)
{
    if (string.IsNullOrEmpty(Request["mac"])) { return; }
    if (string.IsNullOrEmpty(Request["dsl"])) { return; }
    DataLayer.Checkers.BTmacCheckResponse rsp = DataLayer.Checkers.Foo.CheckMAC(Request["dsl"], Request["mac"]);

    writer.Write(rsp.Valid.ToString());
}

* Có rất nhiều thư viện để lựa chọn, thậm chí bạn có thể tự cuộn. Tôi sẽ giới thiệu jQuery , nó ổn định và có một bộ tính năng mở rộng.


8
Tôi khá chắc chắn rằng có một nơi đặc biệt trong địa ngục dành cho những người xây dựng đoạn mã JavaScript trên máy chủ như thế
Raynos

1
@Raynos Không có gì sai khi tạo phía máy chủ JavaScript.
Tom Squires

2
nếu bạn muốn máy chủ làm bất cứ điều gì, bạn gửi yêu cầu HTTP (sử dụng XHR) đến một URI hợp lý với dữ liệu hợp lý. Từ đó, máy chủ HTTP sẽ biết phải làm gì với nó.
Raynos

KHÔNG ĐƯA RA BẤT CỨ NÀO NÀO TRÊN SÂN MÁY. NÓ ĐI VÀO KHÁCH HÀNG. HENT TÊN MÃ TÊN KHÁCH HÀNG TÊN. Rất tiếc, khóa phím bị kẹt.
snowYetis

3

JSON là cách thực hành tốt nhất để hoàn thành nhiệm vụ. Đừng xem vấn đề là sự chuyển giao giữa "C # và JavaScript". Cách suy nghĩ này dẫn đến những điều kỳ quặc về mã như những gì bạn có trong bài viết gốc.

Tổng quát hơn, nó chỉ chuyển các đối tượng giữa máy khách và máy chủ theo kiểu bất khả tri ngôn ngữ. JSON rất tốt cho nhiệm vụ vì nó được hỗ trợ rộng rãi và dễ đọc.


2

Để đặt thẻ đầu vào không cần asp máy chủ, bạn có thể sử dụng: (hoặc <% #%> cho biểu mẫu dữ liệu)

html:

<input type="hidden" value='<%= RandomValues %>' name="RANDOM_VALUES" />

kiểm soát asp:

<asp:HiddenField ID="RandomList" runat="server" />

để có được các giá trị trên postback

Request.Form["RANDOM_VALUES"]

Nếu nó, asp kiểm soát đầu vào ẩn, bạn có thể sử dụng

Request.Form[RandomList.UniqueID]

Phần gọn gàng về Request.Form là nếu bạn có nhiều thẻ có cùng thuộc tính "name", nó sẽ trả về kết quả trong CSV.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.