加载用户控件的一些方式(部分参考网络)

如有不明白的地方欢迎加QQ群14670545 探讨

主要是通过System.Web.UI.UserControl的LoadControl方法

1.模版型

我们新建一个txt文件,里面写入一个用户控件的代码

<%--用户控件模板--%>

<%@ Control Language="C#" ClassName="MyPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Calendar1.BackColor = System.Drawing.Color.LightBlue;
    }
    
    protected void Calendar1_DayRender(object sender, DayRenderEventArgs e)
    {
        if (e.Day.Date == DateTime.Now.Date)
        {
            e.Cell.Controls.Clear();
            var img = new Image { ImageUrl = "http://avatar.profile.csdn.net/1/8/D/2_sp1234.jpg", AlternateText="今日" };
            e.Cell.Controls.Add(img);
        }
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
		<asp:Calendar ID="Calendar1" runat="server" ondayrender="Calendar1_DayRender"></asp:Calendar>
		aslkdfka dsfasdfasdf<br />
		<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
    </form>
</body>
</html>

新建一个页面ExecuteTXT.aspx,来执行我们要加载的用户控件

页面代码如下

<%@ Page Language="C#" %>

<script runat="server">
 
    protected void Page_Load(object sender, EventArgs e)
    {
        var tar = Server.MapPath("~/Manager/MyPage.ascx");
        if (!System.IO.File.Exists(tar))
            System.IO.File.Copy(Server.MapPath("~/Manager/MyPage.txt"), tar);

        var uc = this.LoadControl("~/Manager/MyPage.ascx");
        this.Controls.Add(uc);
    }
</script>

这时候我们运行ExecuteTXT.aspx文件就会在对应目录下面生成一个MyPage.ascx文件。效果自己可以看到


这么做的好处是,我们可以在后台随时编辑这个txt文件。当然,如果这个用户控件有服务器控件事件的话,这点不好处理,需要专门写一些规则来定义,然后按照规则来编辑事件,其实也好处理,因为我们可以自定义控件,然后按规则来生成,相当于cms的模板一样。也就是说

if (!System.IO.File.Exists(tar))
            System.IO.File.Copy(Server.MapPath("~/Manager/MyPage.txt"), tar);
这一段我们做加工处理啦

2.重写Render方法

写一个基类,比如WrapperPageBase .cs,它继承于System.Web.UI.Page

代码如下:

namespace MyWebSiteTest
{   
    public class WrapperPageBase : System.Web.UI.Page
    {
        /// <summary>
        /// 
        /// </summary>
        public System.Web.UI.UserControl control { get; set; }

        protected override void Render(System.Web.UI.HtmlTextWriter writer)
        {
            if (control == null)
                control.LoadControl("~/Controls/default.ascx");

            control.RenderControl(writer);
            base.Render(writer);
        }

    }
}

OK,我们去Controls文件夹下面新建几个用户控件


下面做简单的测试,代码也就简单的写了下:

ccA:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ccA.ascx.cs" Inherits="MyWebSiteTest.Controls.ccA" %>
我是ccA控件呈现的

ccB:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ccB.ascx.cs" Inherits="MyWebSiteTest.Controls.ccB" %>
我是ccB控件呈现的


default:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="default.ascx.cs" Inherits="MyWebSiteTest.Controls.default" %>
我是default控件呈现的


JustWant:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="JustWant.ascx.cs" Inherits="MyWebSiteTest.Controls.JustWant" %>
我是ccA控件呈现的

做完这些,下面我们新建一个页面,比如Ajax_Test.aspx,它的后台.cs文件继承WrapperPageBase,上面我们写过的
然后在它的后台文件中添加如下代码:
namespace MyWebSiteTest.Manager
{
    public partial class Ajax_Test : WrapperPageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var str = Request["Want"];
            if (str == "IWantA")
                this.control = (UserControl)this.LoadControl("~/Controls/ccA.ascx"); // 用户控件ccA           
            else if (str == "IWantB")
                this.control = (UserControl)this.LoadControl("~/Controls/ccB.ascx"); // 用户控件ccB
            else if (str == "JustWant")
                this.control = (UserControl)this.LoadControl("~/Controls/JustWant.ascx");//用户控件JustWant
            else
                this.control = (UserControl)this.LoadControl("~/Controls/default.ascx");
        }
    }
}

到此,自己测试下吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值