代码之家  ›  专栏  ›  技术社区  ›  Mark Allison

如何在ASP.NET应用程序中实现状态栏?

  •  1
  • Mark Allison  · 技术社区  · 14 年前

    我有一个简单的ASP.NET应用程序,它有一个名为master page.master的母版页。在MasterPage.master中,我有一个名为 lblStatus . 我想在网站发生某些事件时更新此标签的文本,并始终显示最新状态,无论我在网站的哪个网页上。

    这是我想做的,但我不确定这是否是最优雅的:

    1. 使用代码创建一个新的类文件以更新会话状态 Session["status"]
    2. 在这个新的类文件中调用一个方法,以便在出现问题时更新会话状态
    3. 在master page.MasterPage的PageLoad事件中,更新 lblStatus.Text 具有 会话[“状态”]

    问题

    1. 我应该用一个 Literal 而不是 Label ?
    2. 换个方式做会更好吗?

    谢谢,这是我在MasterPage.master中的代码:

    <%@ Master Language="C#" %>
    
    <script runat="server">       
        public string StatusText
        {
            get { return ltlStatus.Text; }
            set { ltlStatus.Text = value; }        
        }    
    </script>
    
    <html>
    <head runat="server" id="Header">
        <asp:contentplaceholder id="ContentPlaceHolderScript" runat="server" />
        <title>MooDB - </title>
    </head>
    <body>
        <form id="frmMaster" runat="server">
        <div>        
            <asp:Menu ID="mnuNav" Orientation="Horizontal" runat="server">
            <.. removed for brevity ..>
            </asp:Menu>
        </div>
        <div>
            <asp:Literal ID="ltlStatus" runat="server" />
        </div>
        </form>
    </body>
    </html>
    

    我不确定下一步该怎么办。我是否需要将此代码复制到我网站中的每一页:?

    <%@ Page Language="C#" %>
    
    <script runat="server">
    
        private void ChangeStatus(string newStatus)
        {
            ((SiteMaster)this.Master).StatusText = newStatus;
        }
    
    </script>    
    
    <asp:Content ContentPlaceHolderID="contentMain" runat="server" ID="Main" >
    
        <... my page content ...>
    </asp:Content>
    

    抱歉,我是新来的ASP.NET,我不知道该怎么办。什么是站点管理员?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Arseni Mourzenko    14 年前

    对问题1的答复:

    嗯,真的没关系。我觉得用起来比较干净 Literal 当你不需要一个指向表单字段的标签,但是,嗯,大多数人使用 Label 在任何情况下。或直接输出文本 <% %> .

    对问题2的答复:

    不需要为此使用会话。相反,使用 this.Master 直接访问母版页。然后可以从页面更新标签的值。

    例如,执行以下操作:

    public class SiteMaster : MasterPage
    {
        public string StatusText { get; set; }
    }
    

    以及:

    public class HomePage : Page
    {
        public void ChangeStatus(newStatus)
        {
            // Remember to cast this.Master to the class you use for the masterpage.
            ((SiteMaster)this.Master).StatusText = newStatus;
        }
    }
    

    回答你最后的问题:

    我需要将此代码复制到我网站的每个页面上吗?

    对。 除非 每个页面都继承自父类 Page 上课。

    什么是站点管理员?

    SiteMaster 是班级吗 给了我的主页。可能是 Template , Global ,或 你想要什么都行 .

    如果有帮助的话,这里有一个完整的例子:

    Class diagram

    文件 站点.主 :

    <%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="Demos.StackOverflow.MasterPages.SiteMaster" %>
    
    <!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>Sample code for StackOverflow</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <a href="Default.aspx">Home page</a> | <a href="Products.aspx">Products</a>
        <div>
            <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
            </asp:ContentPlaceHolder>
        </div>
        <div id="Status">
            <%= this.StatusText %>
        </div>
        </form>
    </body>
    </html>
    

    文件 站点.Master.cs :

    namespace Demos.StackOverflow.MasterPages
    {
        using System;
        using System.Web.UI;
    
        // Here's my SiteMaster class.
        public partial class SiteMaster : MasterPage
        {
            public string StatusText { get; set; }
    
            protected void Page_Load(object sender, EventArgs e)
            {
            }
        }
    }
    

    文件 页面状态 :

    namespace Demos.StackOverflow.MasterPages
    {
        using System.Web.UI;
    
        // This parent class inherits System.Web.UI.Page. This avoids code duplication.
        public class PageWithStatus : Page
        {
            protected void ChangeStatus(string newStatus)
            {
                ((SiteMaster)this.Master).StatusText = newStatus;
            }
        }
    }
    

    文件 默认.aspx :

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
        CodeBehind="Default.aspx.cs" Inherits="Demos.StackOverflow.MasterPages.DefaultPage" %>
    
    <asp:Content ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
        <asp:Button runat="server" Text="Button" OnClick="DefaultButton_Click" />
    </asp:Content>
    

    文件 默认.aspx.cs :

    namespace Demos.StackOverflow.MasterPages
    {
        using System;
    
        // Here, we inherits from PageWithStatus, not from Page.
        public partial class DefaultPage : PageWithStatus
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }
    
            protected void DefaultButton_Click(object sender, EventArgs e)
            {
                this.ChangeStatus("Done!");
            }
        }
    }
    

    文件 产品.aspx :

    <%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true"
        CodeBehind="Products.aspx.cs" Inherits="Demos.StackOverflow.MasterPages.ProductsPage" %>
    
    <asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
        <asp:Button runat="server" Text="Buy" onclick="BuyButton_Click" /><br />
        <asp:Button runat="server" Text="Sell" onclick="SellButton_Click" />
    </asp:Content>
    

    文件 产品.aspx.cs :

    namespace Demos.StackOverflow.MasterPages
    {
        using System;
    
        // Here, we inherits from PageWithStatus, not from Page.
        public partial class ProductsPage : PageWithStatus
        {
            protected void Page_Load(object sender, EventArgs e)
            {
            }
    
            protected void BuyButton_Click(object sender, EventArgs e)
            {
                this.ChangeStatus("The product is purchased.");
            }
    
            protected void SellButton_Click(object sender, EventArgs e)
            {
                this.ChangeStatus("The product is sold.");
            }
        }
    }