我有一个关于在ascx自定义Web控件中创建和管理事件的问题。
我创建了一个非常愚蠢的控件,包含一个包含asp:Label控件的div,它是一个非常简单的结构:
<div id="mydiv" runat="server">
<asp:Label id="mylabel" text="Text"... />
</div>
那很简单。 我想添加一个事件:点击。我想让用户在页面上添加此控件并将处理程序附加到此事件,以便在单击此控件时可以执行某些操作。这似乎是一个奇怪的解决方案,就像我试图再次发明按钮控件,即:我的自定义按钮。 好吧,要发起这个事件,我想在我的div中添加一个javascript并调用一个js函数,使用ajax机制调用服务器端函数。 那么如何从这里调用服务器端功能。我发布了一个关于如何从客户端调用服务器端功能的问题,并得到了一些答案(其中许多人告诉我使用PageMethods),好像看起来页面方法不起作用,它编译但运行时点击我的控制和执行js(在PageMethods.mymethod()行中)我有一个错误 - &gt; Java脚本异常:无法识别的方法。似乎找不到PageMethod。
嗯,考虑到我的目标,我该怎么办? 啊,像这样的解决方案:使用标签中的click事件不是我想要的,因为点击事件必须在我点击div时触发,考虑我可能设置一个大的填充,这样一个大的空白空间可以提供一个大的可点击区域。
提前致谢。
答案 0 :(得分:1)
在用户控件中创建一个事件
例如: -
public event EventHandler<CustomEventArgs> Click;
和处理程序
public void OnClick()
{
if(this.Click !=null)
{
//what ever else you do
this.Click(new CustomEventArgs(...));
}
}
还可以在用户控件上处理鼠标单击(mouseleftbuttonup)(并从那里触发事件)。即。
protected void OnMouseDown(...){ this.OnClick(); }
从ASP.NET页面,您可以注册用户控件事件并处理它:
MyControl.Click += new EventHandler<CustomEventArgs>(myctr_click)
protected myctr_click(object sender, CustomEventArgs e){
//do anything
}
答案 1 :(得分:0)
PageMethods在页面类中使用Web服务;我假设您想要回发到服务器并在页面中处理此单击,对吧?
回发的所有控件都使用__doPostBack('clientid','')方法回发到服务器。你的标签需要做同样的事情。在控件中,控件需要实现IPostBackEventHandler来处理这些事件,并引发click事件。
答案 2 :(得分:0)
我可能误解了你的要求,但你不能把div包裹在asp:linkbutton
吗?
<asp:LinkButton ID="lnkSomething" runat="server" OnClick="lnk_something_Click">
<div id="mydiv" runat="server">
<asp:Label id="mylabel" text="Text"... />
</div>
</asp:LinkButton>
然后在服务器端:
protected void lnk_something_Click(object sender, EventArgs e)
{
}
正如评论中提到的yellowfrog,您可以通过在更新面板中进一步将其包装为异步回发来扩展它。