C#ASP.NET用户控件如何处理div点击服务器端?

时间:2009-09-24 09:42:33

标签: c# asp.net user-controls

我正在创建一个用户控件。用户控件是一个div,我想向它添加一个click事件。

编辑:

具有此控件的页面必须处理此事件。

我该怎么做?

4 个答案:

答案 0 :(得分:9)

首先,您需要在UserControl上定义一个事件,该事件允许包含Page的{​​{1}}注册并处理该事件。例如:

UserControl

注意: 如果您使用支持回发的控件,下一部分会更容易。但是,由于您要使用public partial class MyUserControl : System.Web.UI.UserControl { // Event for page to handle public event EventHandler DivClicked; protected virtual void OnDivClicked(EventArgs e) { if (DivClicked != null) DivClicked(this, e); } protected void Page_Load(object sender, EventArgs e) { // Page Load Code goes here } } ,我将解释如何强制div进行回发。我要感谢Mathew Nolton这个解决方案。

因此,在div的{​​{1}}方法中,您需要添加Page_Load属性来调用ASP.NET的UserControl javascript函数,该函数会为您调用服务器onClick。这使__doPostback()能够回发到服务器。另外,为了确定哪个控件引起了回发,我提供了div的{​​{1}}以及一些符号来区分我的回发和其他控件。请记住,当您在.ascx文件上定义div时,必须分配div并设置ClientId才能在服务器端访问。

好的,现在通过向div添加id属性,只要点击它就会回发到服务器。因此,当回发导致runat="server"被调用时,我会检查是否是导致回发的onclick。如果是这样,我会将div的{​​{1}}事件提升为由Page处理。

Page_Load

应该为div执行此操作,现在您只需在页面上注册UserControl事件。

不幸的是,您无法获得设计时间支持来注册该活动。但是,您仍然可以将代码添加到.aspx页面。在您放弃DivClicked的页面上,向名为public partial class MyUserControl : System.Web.UI.UserControl { // Event Definition and Raising methods ... protected void Page_Load(object sender, EventArgs e) { // @@@@ will denote this is an argument I provided. string arg = "@@@@" + divClickableDiv.ClientID; // Add postback method to onClick divClickableDiv.Attributes.Add("onClick", Page.ClientScript.GetPostBackEventReference(divClickableDiv, arg)); if (IsPostBack) { // Get event arguments for post back. string eventArg = Request["__EVENTARGUMENT"]; // Determine if postback is a custom postback added by me. if (!string.IsNullOrEmpty(eventArg) && eventArg.StartsWith("@@@@")) { // Raise the click event for this UserControl if the div // caused the post back. if (eventArg == arg) OnDivClicked(EventArgs.Empty); } } } } 的{​​{1}}添加属性,其中XXX是名称事件。所以,对于我上面的例子,我将在页面上定义我的UserControl看起来像这样:

DivClicked

现在您将处理程序代码添加到UserControl的代码隐藏文件中(假设您使用代码隐藏),如下所示:

UserControl

应该这样做。我希望这篇文章可以帮助你。

答案 1 :(得分:1)

<div runat="server" onserverclick="MyClickHandler">
...
</div>

答案 2 :(得分:0)

Rocka的答案很接近,但不太正确(因为它对我不起作用,我想出了原因)。

Rocka用户控件的代码位很好:    //要处理的页面的事件     公共事件EventHandler DivClicked;

protected virtual void OnDivClicked(EventArgs e) 
{ 
    if (DivClicked != null) 
        DivClicked(this, e); 
} 

使用UserControl时,以下操作无效:

OnDivClicked不是事件处理程序,它是一个函数,因此您无法分配它。更不用说,当函数触发时,实际的事件处理程序变量为null,因此它不会执行任何操作。

正确的方法是:

这会将MyUserControl1_DivClicked指定为DivClicked的处理程序。遗憾的是,这实际上并没有起作用,所以在页面的Page_Load的代码隐藏中,改为使用这一行:

this.MyUserControl1.OnClick + = new EventHandler(MyUserControl1);

另外,作为旁注,如果你将div设为runat =“server”,那么OnClick会作为你可以连接的事件公开。您需要的只是用户控件中的EventHandler的passthru属性。

答案 3 :(得分:0)

在你的ItemTemplate中 USE asp:面板INSTEAD OF div标签(面板呈现为div)并设置Visibility属性,如下所示:

<asp:Panel ID="ImgFeatured" runat="server" CssClass="featured-ribbon"> </asp:Panel>

背后的代码

Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured");
ImgFeatured.Visible = true;