__DoPostBack () nasıl kullanılır


161

ASP.NET kullanarak asyncrhonous postback oluşturmaya çalışıyorum __doPostBack(), ama bunu nasıl yapacağım hakkında hiçbir fikrim yok. Vanilya JavaScript kullanmak istiyorum.

Düğme tıklaması gibi basit bir şey __doPostBack()etkinliğin tetiklenmesine neden olabilir . Sadece mekanizmanın nasıl çalıştığını öğrenmeye çalışıyorum.



9
Her şeyden önce __doPostBack, UpdatePanel içindeki denetim tarafından tetiklenmedikçe eşzamansız eyleme neden olmaz.
Ladislav Mrnka

Bu neden c # ve javascript olarak etiketlendi . Javascript bölümünü anlıyorum , ancak c # bölümünü değil.
Solomon Ucko

1
@Solomon Ucko - çünkü __doPostBack (), sayfanın büyük olasılıkla C # (VB.NET olabilir) olan sunucu tarafı uygulamasına POST yapmasına neden olur
sh1rts

1
Genellikle çalışırken, elle ekleme __doPostBackaslında desteklenmez. Sayfanızda bir geri gönderimi tetikleyen hiçbir şey yoksa, asp.net __doPostBackişlevi tanımlamayı atlayabilir . Desteklenen yaklaşım, ClientScriptManager.GetPostBackEventReferenceformda bir dize döndüren __doPostBack(...)ve bunun __doPostBacktanımlanmasını sağlayan çağrıdır .
Brian

Yanıtlar:


156

Bunu web formunuzda btnSave adında bir düğme ile deneyebilirsiniz:

<input type="button" id="btnSave" onclick="javascript:SaveWithParameter('Hello Michael')" value="click me"/>

<script type="text/javascript">
function SaveWithParameter(parameter)
{
  __doPostBack('btnSave', parameter)
}
</script>

Ve arkasındaki kodunuza değeri okumak ve üzerinde çalışmak için böyle bir şey ekleyin:

public void Page_Load(object sender, EventArgs e)
{
  string parameter = Request["__EVENTARGUMENT"]; // parameter
  // Request["__EVENTTARGET"]; // btnSave
}

Bir deneyin ve bunun sizin için işe yarayıp yaramadığını bize bildirin.


1
Kısa bir soru, __EVENTARGUMENT parametre mi yoksa btnSave?
harsimranb

3
Bu parametredir. __EVENTTARGET size düğmeyi verecektir.
Bay Bay

i __doPostBack yapmak iki veya daha fazla düğme varsa o zaman nasıl page_load () sunucu tarafında onları ayırt.
khalid khan

1
Birden fazla parametrem olduğunda durum nedir?
Wilson

1
Başka şekilde @Wilson sizin C # bir nesneye eşlenebilmesi Json verilerini olabilir sizin argüman, daha sonra vs. nesne deserialise / tefrika Json.NET kullanabileceğini düşündüm
Sn Sn

25

Bu aynı zamanda sunucu tarafı kontrollerin FancyBox ve / veya jQuery Dialog içinde geri gönderilmesini sağlamanın iyi bir yoludur . Örneğin, FancyBox-div'de:

   <asp:Button OnClientClick="testMe('param1');" ClientIDMode="Static"  ID="MyButton"  runat="server" Text="Ok" >
</asp:Button>

JavaScript:

function testMe(params) {
    var btnID= '<%=MyButton.ClientID %>';          
    __doPostBack(btnID, params);
}

Sunucu tarafı Page_Load:

 string parameter = Request["__EVENTARGUMENT"];
 if (parameter == "param1")
     MyButton_Click(sender, e);

4
ClientID değil UniqueID kullanmalıdır.
Garr Godfrey

Veya set ClientIDMode="Static"vasfını MyButtonASP düğmesinin kimliğini bozmak olmaz böylece.
David R Tribble

14

İşte nasıl çalıştığı hakkında kısa bir eğitim__doPostBack() .

Dürüst olmak gerekirse, fazla kullanmıyorum; en azından doğrudan. Birçok sunucu kontrolleri, (örneğin Button, LinkButton, ImageButton, parçaları GridViewvb) kullanımı __doPostBackonların sonrası geri mekanizması olarak.


6 yıl sonra hızlı ileri; Bunu hala kullanırsam şok olurum. Web geliştirmeye yönelik yaklaşım genellikle böyle şeylerin kullanıldığı zihniyetten uzaklaşmıştır.
Phil

@Phil - haha, bu uygulamanın uygulandığı bir hataya bakarken dün bu konuyu okuyordum :) Bu gün ve yaşta oldukça eski görünüyor
Terry Delahunt

12
6 yıl hızlı ilerledikçe ... ve ASP.NET Web Formları bunu hâlâ yapıyor. Bu nedenle, kabul edilen cevabın ezici tepkisi.
kbrimington

@kbrimington: ASP.NET'in "bunu hala yapmayacağını" söylemedim. Çok değişmesini beklemiyorum. Demek istediğim, daha az insan ASP.NET WebForm'u yeni geliştirme için kullanıyor ve diğerleri bunu taşıyor.
Phil

10

Ben sadece bu gönderiye bir şeyler eklemek istiyorum asp:button. ClientId denedim ve benim için çalışmıyor gibi görünüyor:

__doPostBack('<%= btn.ClientID%>', '');

Ancak, UniqueId'i almak, aşağıdaki gibi sunucuya geri gönderiliyor gibi görünüyor:

__doPostBack('<%= btn.UniqueID%>', '');

Bu, gelecekte başka birine yardımcı olabilir ve bu nedenle bunu gönderebilir.


1
Evet, sorun yaşıyordum ClientIDçünkü kullanıyordum ClientIDMode = Static. Kullanarak UniqueIDçalıştı.
Phiter

Bunu işe almak için çalışıyorum ve ne ClientID ne de UniqueId benim için çalışıyor.
atamata

AMAN TANRIM! Birkaç gün bu sorunu çözmeye çalışıyor. UniqueID sorunu çözdü. Tesekkurler dostum!
Faiz Infy

2

Eski soru, ama bir şey eklemek istiyorum: arama yaparken doPostBack()eylem için sunucu işleyici yöntemini kullanabilirsiniz.

Örnek olarak:

__doPostBack('<%= btn.UniqueID%>', 'my args');

Sunucuda ateşlenir:

protected void btn_Click(object sender, EventArgs e)

Argümanı almak için daha iyi bir yol bulamadım, bu yüzden hala kullanıyorum Request["__EVENTARGUMENT"].


0

Diğerlerinin söylediği gibi, __doPostback () yöntemine denetimin UniqueID değerini sağlamanız gerekir.

__doPostBack('<%= btn.UniqueID %>', '');

Sunucuda, gönderilen form değerleri sayfadaki alanların ad özniteliğiyle tanımlanır .

UniqueID'nin çalışmasının nedeni , sunucu denetimi HTML'de işlendiğinde UniqueID ve adın aslında aynı şey olmasıdır.

İşte UniqueID'nin ne olduğunu açıklayan bir makale:

UniqueID özelliği, giriş alanlarının ("onay kutuları, açılır listeler ve gizli alanlar) HTML" ad "özelliği için değer sağlamak amacıyla da kullanılır. UniqueID, geri gönderme işlemlerinde de büyük rol oynar. Geri gönderimleri destekleyen bir sunucu denetiminin UniqueID özelliği, __EVENTTARGET gizli alanı için veri sağlar. ASP.NET Çalışma Zamanı daha sonra geri gönderimi tetikleyen denetimi bulmak için __EVENTTARGET alanını kullanır ve sonra RaisePostBackEvent yöntemini çağırır.

src: https://www.telerik.com/blogs/the-difference-between-id-clientid-and-uniqueid


0

Ben böyle yaparım

    public void B_ODOC_OnClick(Object sender, EventArgs e)
    {
        string script="<script>__doPostBack(\'fileView$ctl01$OTHDOC\',\'{\"EventArgument\":\"OpenModal\",\"EncryptedData\":null}\');</script>";
        Page.ClientScript.RegisterStartupScript(this.GetType(),"JsOtherDocuments",script);               
    }
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.