İ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ı veIPostBackDataHandler::RaisePostDataChangedEvent()
denRaisePostBackEvent()
ç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. SadeceIPostBackDataHandler
'u uygularsak gerçekleşir. Web üzerinde birçok çözüm__doPostback
, UniqueID vb gerçekteIPostBackDataHandler
uygularken gerçekten sorun gideren suçlu olarak işaret ediyor gibi görünüyor. - Denetim,
IPostBackEventHandler
uygular ancakIPostBackDataHandler
'u uygular. Bunun doğru olduğunu düşünüyorum çünkü kontrolün veriye dayalı olayları gündeme getirmesi gerekmiyor. Yani çalışmak içinIPostBackDataHandler
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?
public class MyButton: Button – EJD
@EJD, sınıf hiyerarşisini değiştirmemize izin verilmiyor – Ali