2015-07-21 14 views
9

İki gün boyunca bunu araştıran başka bir iş arkadaşımla geçirdim. Bu sorunu tartışan çoğu çözümün ya yanlış bir çözüm ya da yanlış bir sebepten ötürü işe yarayan bir çözümü olduğunu düşündüğümde şaşırdım.RaisePostBackEvent yanlış denetim çağrısında bulundu

Basıldığında bir ServerClick olayını yükseltmesi gereken özel bir düğme denetimine sahibiz. olay kabul butonuna kaldırdı değildir:

public class MyButton : WebControl, IPostBackEventHandler 
{ 
    protected HtmlGenericControl _Button; 
    protected string _OnClick = ""; 
    protected string _Name; 
    public event EventHandler ServerClick; 
    // etc...  

    public MyButton() 
    { 
     Width = Unit.Pixel(100); 
     _Button = new HtmlGenericControl("button"); 
     Controls.Add(_Button); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     _Button.Attributes.Add("id", string.IsNullOrEmpty(_Name) ? base.ID : _Name); 
     _Button.Attributes.Add("name", _Name); 

     // etc... 

     _OnClick = Page.ClientScript.GetPostBackEventReference(this, ""); 
     _Button.Attributes.Add("onClick", _OnClick); 

     // etc... 

     ID = String.Empty; 
     Name = String.Empty; 
     AccessKey = String.Empty; 
     TabIndex = -1; 
     Width = Unit.Empty; 

     base.Render(writer); 
    } 

    protected virtual void OnServerClick() 
    { 
     if (this.ServerClick != null) 
     { 
      this.ServerClick(this, new EventArgs()); 
     } 
    } 

    public void RaisePostBackEvent(string eventArgument) 
    { 
     this.OnServerClick(); 
    } 
} 

tarayıcısında kodu sona bu düğmelerin

<form> 

    <!-- etc ... --> 

    <div class="row actionBar"> 
     <PGSC:MyButton Name="btnAccept" ID="btnAccept" LabelID="3244" TabIndex="70" runat="server" OnServerClick="AcceptClickHandler"/> 
     <PGSC:MyButton Name="btnClose" ID="btnClose" LabelID="349" OnClick="window.returnValue=frmMMD.hdnMmdId.value;window.close();" TabIndex="80" runat="server" /> 
    </div> 
</form> 

Sorun iki kullanır: İşte özetlenmiştir koddur. Hata ayıklama, RaisePostBackEvent'un çağrıldığını, ancak ServerClick işleyicisinin eklendiği Kapat düğmesindeyse, hiçbir şey olmuyor. Hiçbir etkinlik işleyicisi aranmaz.

Notlar: sayfasında yalnızca bir MyButton varsa

  • sorun görmedim.
  • Düğmeler, kabul düğmesi sayfanın sonuncu olacak şekilde yeniden sıralanırsa, çalışmaya başlar.
  • Düğmelerin form düğmesinin dışında taşınması olayların beklendiği gibi çalışmasına neden olur ve kabul düğmeleri olay işleyicisi doğru çağrılır.
  • IPostBackDataHandler uygulanması ve IPostBackDataHandler::RaisePostDataChangedEvent() den RaisePostBackEvent() çağrılırken formu etiketinin içine olay kabul düğmesine doğru kalkık neden olur.
  • PageLoad sırasında RegisterRequiresRaiseEvent(btnAccept) numaralı telefonu arayarak olayları doğru kabul et düğmelerine yönlendirir.

Soru:

yukarıdaki çalışmak olanlardan doğru çözümü nedir? Yoksa başka bir çözüm var mı? Sayfadaki çoklu düğmelerin, sayfadaki siparişleri veya konumlarına bakılmaksızın bağımsız tıklama etkinliklerini artırabilecek şekilde çalışmasına ihtiyacımız var.

Benim Düşünceler:

  • Bu sorun görünüyor burada ele alınacak: http://forums.asp.net/t/1074998.aspx?ASP+NET+RaisePostbackEvent+Issues
  • biri inanmak kurşun olduğunu doğru __EVENTTARGET ile __doPostback() arayarak gerektiği otomatik rota düğmesinin doğru olay, ancak Bu gerçekte gerçekleşmiyor. Sadece IPostBackDataHandler'u uygularsak gerçekleşir. Web üzerinde birçok çözüm __doPostback, UniqueID vb gerçekte IPostBackDataHandler uygularken gerçekten sorun gideren suçlu olarak işaret ediyor gibi görünüyor.
  • Denetim, IPostBackEventHandler uygular ancak IPostBackDataHandler'u uygular. Bunun doğru olduğunu düşünüyorum çünkü kontrolün veriye dayalı olayları gündeme getirmesi gerekmiyor. Yani çalışmak için IPostBackDataHandler uygulanması bir kesmek gibi görünüyor. sayfada birden düğmeleri olayları yükseltmek istiyorsanız
  • çalışmayacaktır yanında RegisterRequiresRaiseEvent unintuitive olduğu Kullanılması ve.
  • acaba
  • , nasıl bir asp:Button bunu?
+0

public class MyButton: Button – EJD

+0

@EJD, sınıf hiyerarşisini değiştirmemize izin verilmiyor – Ali

cevap

0

Ben bir durum simüle ettik. Umut eder. MyButton WebServerControl sınıfı vardır:

Sonra bir projede benim web sunucusu denetimini kullanılan
[DefaultProperty("Text")] 
[ToolboxData("<{0}:MyButton runat=server></{0}:MyButton>")] 
public class MyButton : WebControl, IPostBackEventHandler 
{ 
    [Bindable(true)] 
    [Category("Appearance")] 
    [DefaultValue("")] 
    [Localizable(true)] 
    public string Text 
    { 
     get 
     { 
      String s = (String)ViewState["Text"]; 
      return ((s == null) ? String.Empty : s); 
     } 

     set 
     { 
      ViewState["Text"] = value; 
     } 
    } 

    protected HtmlGenericControl _Button; 
    protected string _OnClick = ""; 
    protected string _Name; 
    public event EventHandler ServerClick; 
    // etc...  

    public MyButton() 
    { 
     Width = Unit.Pixel(100); 
     _Button = new HtmlGenericControl("button"); 
     Controls.Add(_Button); 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     _Button.Attributes.Add("id", string.IsNullOrEmpty(_Name) ? base.ID : _Name); 
     _Button.Attributes.Add("name", _Name); 

     // etc... 

     _OnClick = Page.ClientScript.GetPostBackEventReference(this, ""); 
     _Button.Attributes.Add("onClick", _OnClick); 

     // etc... 

     ID = String.Empty; 
     //Name = String.Empty; 
     AccessKey = String.Empty; 
     TabIndex = -1; 
     Width = Unit.Empty; 

     base.Render(writer); 
    } 

    protected virtual void OnServerClick() 
    { 
     if (this.ServerClick != null) 
     { 
      this.ServerClick(this, new EventArgs()); 
     } 
    } 

    public void RaisePostBackEvent(string eventArgument) 
    { 
     this.OnServerClick(); 
    } 
} 

, bunu diyelim default.aspx geçerli:

<div><cc1:MyButton ID="btnAccept" runat="server" TabIndex="70" OnServerClick="AcceptClickHandler" /> 
<cc1:MyButton ID="btnClose" Text="Close" Width="256px" LabelID="349" runat="server" TabIndex="80" /></div><div> 
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> 
</div> 

Ve default.aspx.cs içinde

Ben

protected void AcceptClickHandler(object sender, EventArgs e) 
    { 
     Label1.Text = DateTime.Now.ToLongTimeString(); 
    } 

AcceptClickHandler yangınlar sadece Kabul butonuna tıklandığında ve Kapat düğmesini değil : ettik basitçe olayı hayata'. Maalesef
Birazdan sorunu alamadım eğer.

+0

Teşekkürler. Tam olarak nelerin değiştiğini ve olayların doğru tetiklenmesini sağladığını söyleyebilir misiniz? Ben 'Ad = string.Empty' dışında yorum çalıştı, ancak yardımcı olmadı. Ayrıca her iki düğme '

' etiketlerinin içinde olmak zorunda değil, dışarıda. – Ali

+0

Üzgünüm, kod bütün parça yapıştırmak vermedi, düğmeler formu etiketleri bulunmaktadır. '<= "form1" runat = "server" form id>

\t \t \t
' – tanuk