Bir ASP.NET uygulamasının arkasındaki istemci tarafı Javascript ve C # kodu arasında veri nasıl geçirilmelidir?


21

Bir ASP.NET uygulamasının arkasındaki istemci tarafı JavaScript kodu ve C # kodu arasında veri iletmenin en etkili / standart yolunu arıyorum. Bunu başarmak için aşağıdaki yöntemleri kullanıyorum ama hepsi biraz şeker düşüyor.

JavaScript'ten C # koduna veri iletmek için, gizli ASP değişkenlerini ayarlamak ve bir geri gönderme işlemini tetiklemektir:

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

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

Sonra C # kodunda listeyi toplarım:

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

Diğer yollardan geri dönersek, bir işlevi kaydetmek ve verileri Page_Load sırasında iletmek için genellikle ScriptManager'ı kullanırım:

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

veya Bir geri göndermeden önce veya ilklendirme veya ön oluşturma aşamaları sırasında kontrollere nitelikler eklerim:

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

Bu yöntemler bana iyi hizmet etti ve işi yaptı, ancak tam olarak hissetmiyorlar. İstemci tarafı JavaScript ile C # back-end kodu arasında veri aktarmanın daha standart bir yolu var mı?

Ben gibi bazı mesajları gördüğüm bu bir HtmlElement sınıfını tanımlamak; Bakmam gereken bir şey mi var?



Sunucu ve istemci arasında veri ileterek ne demek istediğine bağlı. Veriler bu noktada bilinirse, sayfa oluşturulur, ardından verilerinizi oluşturmak için bir komut dosyası eklemek veya bir hazır bilgi ya da benzer ya da başka bir varyasyonla json'u ayarlamak tamamen makul. Eğer, OTOH, geri gönderme yapmadan sunucuyla etkileşime giren bir sayfanız olmaya çalışıyorsa, bu tamamen farklı bir sorundur. Kesinlikle json'a bak.
Murph

Örneğin. Bir xml dosyasından bazı veriler alan istemciden bir düğme başlattıysam. Daha sonra C # 'daki veriler üzerinde bazı hesaplamalar yapılır. Sonra bu bitmiş sonuç güzel bir javascript grafik ekranda görüntülenmesini istiyorum. Bu, geri gönderme yapılmadan sonrasına kadar müşterinin sonucu bilmediği bir geri göndermedir.
cwc1983

Bu yorumdan sunucuda hala tüm işleri yapabiliyorsunuz - load / process / return - yani ilk önce ben de aynısını yapardım. Verileri json olarak biçimlendirin, sayfayı oluştururken json'u ekleyin (hazır bilgi bunu yapmanıza izin verir). Bunu işe aldığında muhtemelen daha senkronize olmayan bir şey yapmak istersiniz - ama aynı json olacaktır.
Murph

Herkese teşekkürler. Buradaki önerileri okuduktan ve biraz araştırma yaptıktan sonra, yapmak istediklerimi elde etmenin yeni bir yöntemini buldum. Aldığım asıl sorun, bir Ajax yayını gerçekleştirdiğimde programın nerede olduğunu hatırlamak için müşteri tarafı kodunu alamamamdı. Ben şimdi JQuery $ Ajax.Post kullanıyorum ve Başarı verilerini veriyor ve geri oturum oturumunda müşteriyi kurtarıyor.
cwc1983

Yanıtlar:


9

Bu örnekteki gibi bir statik sayfa yöntemini JavaScript'ten basit ve kolay bir şekilde arayabilirsiniz . Yöntemi birden fazla sayfadan çağırmanız gerekirse, bir web servisi ayarlayabilir ve Javascript'ten de aynı şekilde arayabilirsiniz. Örnek ayrıca aşağıya dahil edilmiştir.

.aspx Kodu

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

Kod arkası kodu

using System.Web.Services;

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

Javascript Kodu

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

NOT: Sayfa yöntemlerinin statik olması gerekir. Bu, uygulamanın ne yapmaya çalıştığına bağlı olarak, sizin için sorunlu olabilir. Ancak, bilgi oturumu tamamen temel alıyorsa ve bir tür yerleşik kimlik doğrulaması kullanıyorsanız, WebMethod dekoratörüne bir EnableSession özniteliği koyabilirsiniz ve bu HttpContext.Current.User’a ulaşmanıza izin verir. Oturum vb.


Harika bir örnek, bu iyi çalışıyor ve ben onu kullanacağım. Teşekkürler!
Mausimo

3

JQuery bir göz atmanızı tavsiye ederim. JQuery, AJAX'ın sunucuya geri dönmesini sağlamak için kullanılabilir, bu da istediğiniz formatta verileri geri alabilir - iyi bir format JSON olabilir, çünkü doğrudan javascript'te kullanılabilir.

JQuery kullanarak veriyi sunucudan javascript'e çekmek için , aşağıdaki getiriler asistanlık bir istek yapar: http://youserver.com/my/uri adresine veri gönderir ve verilen işlevdeki verileri sunucudan alır.

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

Javascript'ten sunucuya veri gönderme benzer şekilde çalışır:

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

Teşekkürler, bu harika, ancak özellikle müşterinin ne göstereceğini bilmeden önce bir geri ödeme yapılması durumlarına atıfta bulunuyorum. Eğer "sonuç" c # ile elde edilirse, müşteriye geri nasıl "enjekte ederim".
cwc1983

3

Microsoft, UpdatePanelkontrolü kesinlikle bir "standart" yol olan ajax yapmak için kısıtladı . Bunu kişisel olarak kullanmanızı tavsiye etmem, doğrudan JavaScript kullanırken sahip olduğunuz özellik ve ayarların yakınında hiçbir yerde bulunmuyor.

Şahsen böyle yapmam:

Standart bir geri gönderme sayfasında kullanmak istediğiniz herhangi bir istemci tarafı değeri için gizli alanlar oluşturun (örneğin, kullanıcı gönderdiğinde)

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

Arkasındaki kodda, istemci tarafını kullanmak istediğiniz kontrolleri kaydedin.

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

Ajax yayınınızı yapmak / almak için bir javascript kütüphanesi * kullanın, ardından cevabı temel alarak sayfayı güncellemek için JavaScript kullanın.

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

İşi yapmak için render yöntemini geçersiz kılan ayrı bir "ajax" sayfası yazın.

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

* Aralarından seçim yapabileceğiniz çok sayıda kütüphane var, kendi başınıza bile dönebilirsiniz. Ben jQuery , istikrarlı ve geniş bir özellik kümesine sahip tavsiye ederim .



1
@Raynos JavaScript sunucu tarafı oluştururken yanlış bir şey yok.
Tom Squires

2
Sunucunun bir şey yapmasını istiyorsanız, mantıklı verilere sahip mantıklı bir URI'ya (XHR kullanarak) bir HTTP isteği gönderirsiniz. Oradan HTTP sunucusu ile ne yapacağınızı bileceksiniz.
Raynos

SUNUCU TARAFINDAN HİÇBİR ŞEY YAPMAYIN. İSTEMCİ ÜZERİNE DEVAM EDİYOR. Dolayısıyla ADI İSTEMCİ YAN KODU. Oops caps lock tuşu kilitlendi.
snowYetis

3

JSON, görevi başarmanın en iyi yoludur. Soruna "C # ve JavaScript" arasında geçiş olarak bakmayın. Bu düşünme şekli, asıl gönderide sahip olduğunuz gibi kod tuhaflıklarına yol açar.

Daha genel olarak, yalnızca istemci ile sunucu arasında nesnelerin dilini biten bir biçimde geçmesi yeterlidir. JSON görev için mükemmeldir çünkü yaygın olarak desteklenir ve okunması kolaydır.


2

Sunucu asp'sine ihtiyaç duymayan bir giriş etiketi ayarlamak için şunları kullanabilirsiniz: (veya form veri tabanı için <% #%>)

html:

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

asp kontrolü:

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

geri göndermedeki değerleri almak için

Request.Form["RANDOM_VALUES"]

Onun ise, asp kontrol gizli girişini kullanabilirsiniz

Request.Form[RandomList.UniqueID]

Request.Form ile ilgili güzel kısım, aynı "name" özniteliğine sahip birden fazla etiketiniz varsa, sonucu CSV olarak döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.