Asp.net用戶控件和委托事件


在Asp.net系統制作過程中,門戶類型的網站,我們可以用DIV+CSS+JS+Ajax全部搞定,但是一旦遇到界面元素比較復雜的時候,還是UserControl比較方便一些,各種封裝,各種處理,然后拖到主頁面,就好了。本文主要講解如何在UserControl和WebForm頁面中利用委托事件傳值。本文僅提供一種思路,如果有更好的方案,還敬請賜教。

首先,我們設計一個簡單的UserControl頁面(實際應用中,我們可以按照業務邏輯,做的復雜一些),請看下圖:

然后在Default.aspx頁面中,我們只需要顯示出從UserControl返回過來的值即可。

在這里,我相信很多人都選擇利用Session或者是Application或者是Cache等等,這些確實也都可以,不過我這次利用Delegate 和 Event來實現,好處有幾點:首先傳過來的值不會莫名其妙的丟失(Session會過期,Cache的東西也會過期,或者是丟失);其次就是代碼更好控制,如果UserControl中新加一些其他控件傳值過來,不用new session或者是cache等,直接放到事件中,拋向接收頁面就行;再者就是由於有事件回調函數,不用再另設Flag來判斷UserControl是不是執行完畢等等。

下面是UserControl前台HTML內容,不做講解:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUC.ascx.cs" Inherits="DelegateWeb.MyUC" %>
<div style="border-bottom:1px solid wheat;width:600px;height:100px; line-height:100px;">
請選擇省份:
<asp:DropDownList ID="ddlBind" runat="server" Height="22px"  Width="200px">
<asp:ListItem Value="0">請選擇</asp:ListItem>
<asp:ListItem Value="1">上海市</asp:ListItem>
<asp:ListItem Value="2">北京市</asp:ListItem>
<asp:ListItem Value="3">廣州市</asp:ListItem>
<asp:ListItem Value="4">深圳市</asp:ListItem>
<asp:ListItem Value="5">河南省</asp:ListItem>
<asp:ListItem Value="6">山東省</asp:ListItem>
</asp:DropDownList>
&nbsp;<asp:TextBox ID="txtKeyWords" runat="server"></asp:TextBox>
&nbsp;<asp:Button ID="btnQuery" runat="server" Text="查詢內容"  onclick="btnQuery_Click" />
</div>
View Code

下面是UserControl后台代碼內容:

using System;
using System.Threading;

namespace DelegateWeb
{
    public delegate void CalculateDelegate(string ddlValue, string keyWords); //定義全局委托
    public partial class MyUC : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        public event CalculateDelegate CalculateEvent; //定義事件
        protected void btnQuery_Click(object sender, EventArgs e)
        {
            //睡眠5s,模擬數據執行操作
            Thread.Sleep(5000);
            string ddlSelectedTextValue = ddlBind.SelectedItem.Text + "|" + ddlBind.SelectedItem.Value;
            string keyWords = txtKeyWords.Text;
             //如果該事件已經被訂閱,則拋出事件,
            // 這里也預示着函數已經執行完畢,開始拋出執行后的結果了
            if (CalculateEvent != null)
                CalculateEvent(ddlSelectedTextValue, keyWords);
        }
    }
}
View Code

這里的代碼很簡單,其實就是利用委托事件,當操作完成后,將執行結果利用事件拋出去。
既然我把執行結果拋出去了,那么該由誰來接呢?毋庸置疑,當然是放置它的主頁面來接收了。我們拖動這個UserControl到主頁面中,則主頁面中會通過

<%@ Register src="MyUC.ascx" tagname="MyUC" tagprefix="uc1" %>

來注冊UserControl

在主頁面代碼中,我們需要接住剛剛拋出的事件:

using System;
using System.Web;

namespace DelegateWeb
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            MyUC1.CalculateEvent += (selectedItem, keyWords) =>
            {
                lblResult.Text =  selectedItem +"  "+ keyWords;
            };
            //事件的注冊都要放到IsPostBack判斷外面,否則會出現丟失的情況
            if (!IsPostBack)
            {
            }
        }
    }
}
View Code

這個我就不多說了,+=號操作就代表注冊事件,以便於進行回調操作。
如果只是說到這里,那么在Ajax大行其道的今天,點擊按鈕就刷新頁面的做法並不會受到很多人的歡迎。這里我就來讓操作Ajax話。

首先拖動ScriptManager到主頁面中,然后拖動UpdatePanel到主頁面中,整個首頁布局如下面的樣子即可:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DelegateWeb.Default" %>
<%@ Register src="MyUC.ascx" tagname="MyUC" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        body{font-size:12px;}
        #MyUC1_ddlBind{border:1px solid wheat;}
        #MyUC1_txtKeyWords{border:1px solid wheat;}
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <uc1:MyUC ID="MyUC1" runat="server" />
        <p>
            從UserControl接收的內容為:<asp:Label ID="lblResult" runat="server" Text=""></asp:Label>
        </p>
        </ContentTemplate>
    </asp:UpdatePanel>
    </form>
</body>
</html>
View Code

然后點擊按鈕,5秒后,頁面輸出了結果,而且完全實現了無刷新頁面局部調用。
顯示結果如下:

 

 做到這里,需要提示下,由於C#提供了Action委托,所以我們現在不需要聲明Delegate委托,直接利用Action,也能實現效果:

 public event Action<string, string> CalculateEvent;

 這篇文章可能過於簡單了,但是提供了一種思路。我很想通過這篇文章和大家討論下Asp.net中的事件傳遞等方面的內容,包括怎么設計等等,以期能夠拋磚引玉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM