使用ViewState和Amenu的一个Web Framework

51 篇文章 0 订阅
32 篇文章 0 订阅

 

这个Framework说实话我用了下不错。而且它是我最近发现的使用ViewState最牛的一个网站模板。

从下面的Copyright可以看出来这个不是我做的,呵呵。左侧的Menu是一个Amenu控件,关于这个控件的类结构图如下:

我会后面把代码传上去有兴趣的可以研究研究。

整个架构的风格很不错,给人的感觉是比较清新明了。Menu中的每个选项都是一个ascx控件,Viewstate的使用使得网站的性能更加好。

页面初始化时的代码:

// Load or reload a UserControl:

    string file = this.TrackedControl;

 

    if (!string.IsNullOrEmpty(file)) {

      if (IsPostBack) ReloadContent();

    }

 

    else {

      file = "~/Controls/Home.ascx";

      if (!IsPostBack) LoadContent(file, null);

      else throw new Exception("Page_Load(): invalid state");  // dbg

}

TrackedControl是个Viewstate:

 

  protected string TrackedControl

  {

    get {

      return ViewState["TrackedControl"] as string;

    }

    set {

      if (value == null) ViewState.Remove("TrackedControl");

      else ViewState["TrackedControl"] = value;

    }

  }

而在前台页面上是通过一个placeholder存放ascx文件:

    <asp:UpdatePanel ID="UpdatePanelAdminData" runat="server"

        UpdateMode="Conditional" ChildrenAsTriggers="False">

        <Triggers>

          <asp:AsyncPostBackTrigger ControlID="ImageLogo" EventName="Click" />

          <asp:AsyncPostBackTrigger ControlID="MTMenuAdmin" EventName="ItemClick" />

          <asp:AsyncPostBackTrigger ControlID="ScriptManager1" EventName="Navigate" />

        </Triggers>

        <ContentTemplate>

          <asp:PlaceHolder ID="PlaceHolderAdminData" runat="server" />

        </ContentTemplate>

        </asp:UpdatePanel>

在点击某个菜单时会清空placeHolder:

PlaceHolderAdminData.Controls.Clear();

鼠标点击事件:

protected void OnMenuClick(object sender, CommandEventArgs e)

  {

    string from = ((Control)sender).ClientID;

    string cmd = e.CommandName;

    string arg = e.CommandArgument as string;

 

    // Parameters for LoadContent()

    ParameterCollection pc = new ParameterCollection();

    pc.Add(new Parameter("CommandArgument", TypeCode.String, arg));

 

    if (!string.IsNullOrEmpty(cmd)) {

      LoadContent(cmd, pc);

    }

  }

根据当前选中的菜单的CommandName来决定加载哪个ascx控件,具体加载时通过LoadContent方法来实现:

public DControl LoadContent(string file, ParameterCollection pc)

  {

    // Remove all controls

    PlaceHolderAdminData.Controls.Clear();

    if (string.IsNullOrEmpty(file)) return null;

   

    // The return value

    DControl dc = null;

 

    // Load the control

    try {

      dc = DControl.LoadUC<DControl>(file, this);

      if (dc == null) throw new Exception();

    }

    catch (Exception ex) {

      string msg = "Couldn't load " + file + ". " + ex.Message;

      throw new Exception(msg);

    }

 

    // Save as tracked control

    TrackedControl = file;

 

    // Pass on parameters

    if (pc != null) dc.Params = pc;

 

    // Insert the new control

    PlaceHolderAdminData.Controls.Add(dc);

 

    // Add history points

    ScriptManager sm = ScriptManager.GetCurrent(Page);

    if (sm.IsInAsyncPostBack && !sm.IsNavigating)

    {

      sm.AddHistoryPoint("UCPage", file);

      sm.AddHistoryPoint("Params", Util.SerializePC(pc));

    }

 

    return dc;

  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值