Как реализовать строку состояния в приложении ASP.NET? - PullRequest
1 голос
/ 11 ноября 2010

У меня есть простое приложение ASP.NET, которое имеет одну главную страницу с именем MasterPage.master. В MasterPage.master у меня есть ярлык с именем lblStatus. Я хочу обновить текст этого ярлыка, когда на сайте происходят определенные события, и всегда отображать последний статус независимо от того, на какой веб-странице я нахожусь на сайте.

Это то, о чем я думаю, но я не уверен, что это самое элегантное:

  1. Создать новый файл класса с кодом для обновления состояния сеанса Session["status"]
  2. Вызовите метод в этом новом файле класса для обновления состояния сеанса всякий раз, когда что-то происходит
  3. В событии PageLoad страницы MasterPage.master обновите lblStatus.Text с помощью Session["status"]

Вопросы

  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 и не знаю, что делать. Что такое SiteMaster?

1 Ответ

3 голосов
/ 11 ноября 2010

Ответ на вопрос 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?

SiteMaster - это класс , который я дал моей главной странице. Это может быть Template, Global или , как вы хотите .

Если это может быть полезно, вот полный пример:

Class diagram

Файл Site.Master :

<%@ 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>

Файл Site.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)
        {
        }
    }
}

Файл PageWithStatus :

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;
        }
    }
}

Файл Default.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>

Файл Default.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!");
        }
    }
}

Файл Products.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>

Файл Products.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.");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...