[修練營ASP.NET]User Control呼叫頁面上Button的Click
前言
有這樣的需求,通常代表著是很糟糕的設計。   
因為User Control與頁面的耦合性變高了。    
不過,當前人拉屎,後人得擦屁股時,   
也顧不了這麼多了,這邊就提供小小的範例來解決這個問題。
這邊的範例的情況是,當頁面上的UserControl需要模擬MasterPage上的Button.Click時,User Control該怎麼設計,怎麼使用。
Play it
首先,我們先新增一個MasterPage,上面要有ScriptManager與一顆Button,當Button被click了,則Button.text顯示現在的時間。
因為前人的code是VB的,我這邊為了符合大雜匯的現況,MasterPage用.master.vb來開發,頁面跟UserControl則是C#。
.master
<%@ Master Language="VB" CodeFile="MasterPage.master.vb" Inherits="MasterPage" %>
<!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>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:Button ID="btnMaster" runat="server" Text="MasterPageButton" />
        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
        </asp:contentplaceholder>        
    </div>
    </form>
</body>
</html>.master.vb
Partial Class MasterPage
    Inherits System.Web.UI.MasterPage
    Protected Sub btnMaster_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnMaster.Click
        Me.btnMaster.Text = System.DateTime.Now.ToString
    End Sub
End Class接著,我們的UserControl上,也有個按鈕。按下去時,要先處理完這個Button的事情,最後再去點MasterPage上的Button。   
這邊我寫了個小小的js function,在點了User Control的按鈕後,要去呼叫這個function,來幫我們點MasterPage上的Button。    
User Control要開一個屬性給頁面來設定要按哪一個按鈕,我們這邊屬性名稱為PageButtonClientID。
.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs"
    Inherits="WebUserControl" %>
<asp:Panel ID="Panel1" runat="server">
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <asp:Button ID="Button1" runat="server" Text="UserControl" OnClick="Button1_Click" />
</asp:Panel>
<script type="text/javascript">
    function clickPageButton(buttonID) {
        var pageButton = $get(buttonID);
        pageButton.click();        
    }
</script>.ascx.cs
using System;
using System.Web.UI;
public partial class WebUserControl : System.Web.UI.UserControl
{
    public string PageButtonClientID
    {
        get;
        set;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "userControlCallClick", "clickPageButton('" + PageButtonClientID + "');", true);
    }
}最後,我們在新增一個頁面,套用MasterPage,拉一個UserControl進來,   
當我們點選User Control的按鈕時,希望也能呼叫MasterPage上Button的Click事件。
我們在PageLoad的時候,找到MasterPage上的Button,並且將Button的ClientID assign給UserControl.PageButtonClientID。
.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="clickByUserControlwithMasterpage.aspx.cs" Inherits="clickByUserControlwithMasterpage" %>
<%@ Register Src="WebUserControl.ascx" TagName="WebUserControl" TagPrefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>                              
                <uc1:WebUserControl ID="WebUserControl1" runat="server" />
            </ContentTemplate>
        </asp:UpdatePanel>
</asp:Content>.aspx.cs
using System;
using System.Web.UI.WebControls;
public partial class clickByUserControlwithMasterpage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Button btnMaster = (Button)(this.Master.FindControl("btnMaster"));
        this.WebUserControl1.PageButtonClientID = btnMaster.ClientID;
    }
}
Page載入的畫面
點了UserControl的按鈕,呼叫btnMaster_Click()。
隨文附上Source Code,包含套用Masterpage與沒套用Masterpage的範例:clickByUserControl.rar
blog 與課程更新內容,請前往新站位置:http://tdd.best/
