ข้อมูลจะถูกส่งผ่านระหว่าง Javascript ฝั่งไคลเอ็นต์และรหัส C # หลังแอพ ASP.NET ได้อย่างไร


21

ฉันกำลังมองหาวิธีที่มีประสิทธิภาพ / มาตรฐานในการส่งผ่านข้อมูลระหว่างรหัส JavaScript ฝั่งไคลเอ็นต์และรหัส C # หลังแอปพลิเคชัน ASP.NET ฉันใช้วิธีการดังต่อไปนี้เพื่อให้บรรลุสิ่งนี้ แต่พวกเขาทั้งหมดรู้สึกว่าเหลวไหล

ในการส่งข้อมูลจาก JavaScript ไปยังรหัส C # คือการตั้งค่าตัวแปร ASP ที่ซ่อนอยู่และเรียกใช้ postback:

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

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

จากนั้นในรหัส C # ฉันรวบรวมรายการ:

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

กลับไปทางอื่นฉันมักจะใช้ ScriptManager เพื่อลงทะเบียนฟังก์ชั่นและส่งผ่านข้อมูลระหว่าง Page_Load:

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

หรือฉันจะเพิ่มแอททริบิวให้กับการควบคุมก่อนโพสต์กลับหรือระหว่างขั้นตอนการเริ่มต้นหรือการแสดงผลล่วงหน้า:

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

วิธีการเหล่านี้ให้บริการฉันดีและทำงาน แต่พวกเขาก็รู้สึกไม่สมบูรณ์ มีวิธีมาตรฐานในการส่งผ่านข้อมูลระหว่าง JavaScript ฝั่งไคลเอ็นต์และรหัสด้านหลัง C # มากขึ้นหรือไม่

ฉันเคยเห็นโพสต์เช่นนี้ที่อธิบายถึงระดับ HtmlElement; นี่คือสิ่งที่ฉันควรตรวจสอบหรือไม่



มันขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยการส่งผ่านข้อมูลระหว่างเซิร์ฟเวอร์และไคลเอนต์ หากทราบข้อมูล ณ จุดนั้นหน้าจะแสดงผลแล้วเพิ่มสคริปต์เพื่อสร้างข้อมูลของคุณหรือการตั้งค่า json ผ่านตัวอักษรหรือคล้ายกันหรือรูปแบบอื่น ๆ มีความเหมาะสมอย่างสมบูรณ์ ถ้า OTOH คุณกำลังพยายามมีหน้าเว็บที่โต้ตอบกับเซิร์ฟเวอร์โดยไม่ทำการ postback นั่นเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง ดู json อย่างแน่นอน
Murph

ตัวอย่างเช่น. หากฉันเปิดใช้งานปุ่มจากไคลเอนต์ที่ได้รับข้อมูลบางอย่างจากไฟล์ xml จากนั้นทำการคำนวณบางอย่างกับข้อมูลใน C # จากนั้นฉันต้องการผลลัพธ์ที่เสร็จแล้วแสดงในการแสดงผลกราฟิกสวยจาวาสคริปต์ เป็นหนึ่งใน postback ที่ลูกค้าไม่ทราบผลลัพธ์จนกว่าจะได้รับการเพิ่มขึ้น
cwc1983

จากความคิดเห็นนั้นคุณยังคงสามารถทำงานทั้งหมดที่เซิร์ฟเวอร์ - โหลด / กระบวนการ / คืน - ดังนั้นในตัวอย่างแรกฉันจะทำอย่างนั้น จัดรูปแบบข้อมูลเป็น json รวมถึง json เมื่อคุณแสดงผลหน้า (ตัวอักษรจะช่วยให้คุณทำเช่นนี้) เมื่อคุณได้งานคุณอาจต้องการทำอะไรแบบอะซิงโครนัสมากกว่าเดิม แต่มันจะเป็น json เดียวกัน
Murph

ขอบคุณทุกคน หลังจากอ่านคำแนะนำที่นี่และทำวิจัยพิเศษฉันพบวิธีใหม่ในการบรรลุสิ่งที่ฉันต้องการจะทำ ปัญหาหลักที่ฉันได้รับคือเมื่อฉันทำการโพสต์ Ajax ฉันไม่สามารถรับรหัสฝั่งไคลเอ็นต์ที่จะจำได้ว่าโปรแกรมอยู่ที่ใด ตอนนี้ฉันกำลังใช้ JQuery $ Ajax.Post เนื่องจากให้การโพสต์ที่ประสบความสำเร็จกลับไปที่ข้อมูลการบันทึกเซสชันของไคลเอ็นต์
cwc1983

คำตอบ:


9

คุณสามารถเรียกเมธอดหน้าสแตติกจาก JavaScript ในตัวอย่างนี้ หากคุณต้องการเรียกวิธีการจากหลาย ๆ หน้าคุณสามารถตั้งค่าบริการเว็บและเรียกใช้จาก Javascript ด้วยวิธีเดียวกัน ตัวอย่างรวมอยู่ด้านล่าง

รหัส. aspx

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

รหัสหลังรหัส

using System.Web.Services;

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

รหัส Javascript

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

หมายเหตุ: วิธีการหน้าจะต้องคงที่ นี่อาจเป็นปัญหาสำหรับคุณขึ้นอยู่กับแอปพลิเคชันที่พยายามจะทำ อย่างไรก็ตามหากข้อมูลเป็นไปตามเซสชันทั้งหมดและคุณใช้การตรวจสอบในตัวบางประเภทคุณสามารถใส่แอตทริบิวต์ EnableSession บนมัณฑนากร WebMethod ได้และจะช่วยให้คุณได้รับ HttpContext.Current.User เซสชั่น ฯลฯ


ตัวอย่างที่ดีมันใช้งานได้ดีและฉันจะใช้มัน ขอบคุณ!
Mausimo

3

ฉันขอแนะนำให้ดูที่ jQuery JQuery สามารถใช้ในการโทร AJAX กลับไปที่เซิร์ฟเวอร์ซึ่งสามารถส่งข้อมูลกลับในรูปแบบที่คุณต้องการ - รูปแบบที่ดีอาจเป็น JSON เนื่องจากสามารถใช้งานได้โดยตรงใน javascript

ในการดึงข้อมูลจากเซิร์ฟเวอร์ลงไปยัง javascript โดยใช้jQueryการดึงข้อมูลต่อไปนี้จะทำการร้องขอแบบอะซิงโครนัสไปยังhttp://youserver.com/my/uriและรับข้อมูลจากเซิร์ฟเวอร์ในฟังก์ชันที่ให้มา

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

การส่งข้อมูลจาก javascript ไปยังเซิร์ฟเวอร์ทำงานในลักษณะเดียวกัน:

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

ขอบคุณนี่เป็นสิ่งที่ดี แต่ฉันหมายถึงเฉพาะสถานการณ์ที่มีการทำ postback ก่อนที่ลูกค้าจะรู้ว่าจะต้องแสดงอะไร หาก "ผลลัพธ์" สามารถทำได้ผ่าน c # ฉันจะทำ "ฉีด" กลับไปยังลูกค้าได้อย่างไร
cwc1983

3

Microsoft ได้ให้UpdatePanelการควบคุมอาแจ็กซ์โดยปริยายเพื่อให้เป็นวิธี "มาตรฐาน" ฉันจะไม่แนะนำให้ใช้เป็นการส่วนตัว แต่จะไม่มีที่ไหนใกล้กับชุดคุณลักษณะที่หลากหลายและการควบคุมที่คุณมีเมื่อใช้ JavaScript โดยตรง

นี่คือวิธีที่ฉันทำ:

สร้างเขตข้อมูลที่ซ่อนสำหรับค่าฝั่งไคลเอ็นต์ใด ๆ ที่คุณต้องการใช้ใน postback ของหน้ามาตรฐาน (เช่นเมื่อผู้ใช้ส่งการส่ง)

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

ในโค้ดด้านหลังรีจิสเตอร์คอนโทรลที่คุณต้องการใช้ฝั่งไคลเอ็นต์

    /* 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);

ใช้ไลบรารี javascript * เพื่อทำ ajax post / get ของคุณจากนั้นใช้ JavaScript เพื่ออัปเดตเพจตามการตอบสนอง

$.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;
    } });

เขียนหน้า sjrate "ajax" ที่แทนที่เมธอด render เพื่อทำงาน

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

*มีห้องสมุดให้เลือกมากมายคุณสามารถม้วนเองได้ ฉันขอแนะนำjQueryให้มีความเสถียรและมีชุดคุณสมบัติที่ครอบคลุม


8
ผมค่อนข้างมั่นใจว่ามีสถานที่พิเศษในนรกสำหรับคนที่ตัวอย่างสตริงสร้าง JavaScript บนเซิร์ฟเวอร์เช่นนั้น
Raynos

1
@Raynos ไม่มีอะไรผิดปกติกับการสร้างฝั่งเซิร์ฟเวอร์ JavaScript
Tom Squires

2
หากคุณต้องการให้เซิร์ฟเวอร์ทำสิ่งใดคุณส่งคำขอ HTTP (โดยใช้ XHR) ไปยัง URI ที่มีเหตุผลพร้อมข้อมูลที่สมเหตุสมผล จากนั้นบนเซิร์ฟเวอร์ HTTP จะรู้ว่าจะทำอย่างไรกับมัน
Raynos

อย่าวางสิ่งใดบน JS บนฝั่งเซิร์ฟเวอร์ มันเกิดขึ้นกับลูกค้า ซ่อนรหัสฝั่งไคลเอ็นต์ของชื่อ โอ๊ะโอตัวพิมพ์ใหญ่ล็อคถูกติด
snowYetis

3

JSON เป็นวิธีปฏิบัติที่ดีที่สุดในการทำงานให้สำเร็จ อย่ามองปัญหาว่าเป็นการผ่านระหว่าง "C # และ JavaScript" วิธีคิดนี้นำไปสู่การแปลกประหลาดของรหัสเช่นสิ่งที่คุณมีในโพสต์ต้นฉบับ

โดยทั่วไปแล้วเป็นเพียงการส่งวัตถุระหว่างไคลเอนต์และเซิร์ฟเวอร์ในภาษาที่ไม่เชื่อเรื่องพระเจ้า JSON นั้นยอดเยี่ยมสำหรับงานเนื่องจากรองรับอย่างกว้างขวางและอ่านง่าย


2

ในการตั้งค่าแท็กอินพุตที่ไม่ต้องการ asp เซิร์ฟเวอร์ด้านคุณสามารถใช้: (หรือ <% #%> สำหรับแบบฟอร์มฐานข้อมูล)

HTML:

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

การควบคุม asp:

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

เพื่อรับค่าใน postback

Request.Form["RANDOM_VALUES"]

ถ้ามันเป็น ASP ควบคุมอินพุตที่ซ่อนอยู่คุณสามารถใช้

Request.Form[RandomList.UniqueID]

ส่วนที่เรียบร้อยเกี่ยวกับ Request.Form คือถ้าคุณมีหลายแท็กที่มีแอตทริบิวต์ "name" เหมือนกันมันจะส่งคืนผลลัพธ์ใน CSV

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.