zoukankan      html  css  js  c++  java
  • ascx + wrapper page + jQuery的Ajax解决方案

    首先,请理解什么是 wrapper page。
    wrapper page 是我定义的一种专门用来包装用户控件 ascx 的 webform,wrapper page 的 Render 方法被重写(override),仅 render 它的 UserControl 成员。这样,我们就可以通过 ascx 输出干净的 html 片断。是的,我们的目标就是输出干净的 html 片断!

    --------------------------------------------------------------------------------

    实现方法
    目标明确了,思路有了,现在让我们来实现吧~
    很简单:写一个 Wrapper Page Base,作为所有 wrapper page 的基类,以后的 wrapper page 都从它继承。这个类(WrapperPageBasel类)继承自System.Web.UI.Page类,他只要做两件事情:

    拥有一个 UserControl 成员
    重写父类(Page)的 Render 方法
    那么我们在重写的 Render 方法里执行 UserControl 的 Render 方法即可。请看代码1):

    /// <summary>
    /// Ajax包装页面基类
    /// </summary>
    public class WrapperPageBase : System.Web.UI.Page
    {
        public UserControl control { get; set; }
     
        protected override void Render(HtmlTextWriter writer)
        {
            if (control == null)
                control = (UserControl)this.LoadControl("~/Controls/dummy.ascx"); // 一个dummy,null时输出server error..之类的信息
     
            control.RenderControl(writer);
        }
    }Wrapper Page继承自WrapperPageBase类:

    public partial class Ajax_Test : WrapperPageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.control = (UserControl)this.LoadControl("~/Controls/any.ascx"); // 有用的用户控件          
        }
    }在页面中,使用jQuery异步调用。参看ashx + jQuery, a lightly ajax solution of asp.net 的实例。
    你的页面只需要一句话:

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Ajax_Test" %>其余都可以删除。——当然,你也可以不删除,你会发现哪些代码不会出现在页面上。你还可以在同一个 Wrapper Page 里来切换 UserControl,只要判断下query string,像这样:

    protected void Page_Load(object sender, EventArgs e)
    {
        var str = Request["Want"];
        if(str == "IWantA")
          this.control = (UserControl)this.LoadControl("~/Controls/A.ascx"); // 用户控件A          
        else if(str == "IWantB")
          this.control = (UserControl)this.LoadControl("~/Controls/B.ascx"); // 用户控件A
        else
          this.control = (UserControl)this.LoadControl("~/Controls/WhatDoYouWant.ascx"); // 用户控件WhatDoYouWant
    }至此,这个解决方案就完成了。

    --------------------------------------------------------------------------------

    为什么要这么做?
    事实上,我们不用 WrapperPageBase,不用重写 Render 方法,简单地把 webform 里的 html 代码全部删掉,再换上我们现在放在 ascx 里的代码,这样也可以达到输出 html 片断的效果。但是为什么要这么麻烦????
    理由如下:

    你不用删除 webform 里的那些代码
    你可以不用修改,使用现成的 ascx
    机制是透明的,你只需要 LoadControl
    最后,你完全可以在同一个 webfrom 里根据不同的 query string 来输出不同的 html 片断 —— 哪怕这些片断毫不相干!神奇吧!
    1) 代码里指定了一个 dummy,当 dummy.ascx 的内容为空,或者不指定 dummy 时,HtmlTextWriter 会显示一个没有内容但是完整的 html 页面,它不是我们要的 html 片断

  • 相关阅读:
    【bzoj1707/Usaco2007 Nov】tanning分配防晒霜——贪心+优先队列
    【bzoj1754/Usaco2005 qua】Bull Math——高精度乘法
    【bzoj1709/Usaco2007 Oct】Super Paintball超级弹珠——递推
    【bzoj2060/Usaco2010 Nov】Visiting Cows 拜访奶牛——树形dp
    【bzoj1710/Usaco2007 Open】Cheappal 廉价回文——区间dp
    【bzoj1828/Usaco2010 Mar】balloc 农场分配——贪心+差分+优先队列
    【bzoj4552/Tjoi2016&Heoi2016】排序——二分+线段树/平衡树+线段树分裂与合并
    【bzoj2083/Poi2010】Intelligence test——二分+贪心
    【bzoj1596/Usaco2008 Jan】电话网络——dfs
    【bzoj1782/Usaco2010 Feb】slowdown 慢慢游——dfs序+树状数组
  • 原文地址:https://www.cnblogs.com/top5/p/1582473.html
Copyright © 2011-2022 走看看