2010-11-11 4 views
1

J'ai une application ASP.NET simple qui a une page maître appelée MasterPage.master. Dans MasterPage.master j'ai un label appelé lblStatus. Je veux mettre à jour le texte de cette étiquette quand certains événements se produisent dans le site Web et affichent toujours le dernier état n'importe quelle page Web que je suis sur le site.Comment implémenter une barre d'état dans une application ASP.NET?

C'est ce que je pense à faire, mais je ne suis pas sûr si cela est le plus élégant:

  1. Créer un nouveau fichier de classe avec le code pour mettre à jour l'état de session Session["status"]
  2. Appel d'un méthode dans ce nouveau fichier de classe pour mettre à jour l'état de session chaque fois que quelque chose arrive
  3. en cas PageLoad de la page MasterPage.master, mettez à jour le lblStatus.Text avec Session["status"]

Questions

  1. Dois-je utiliser un Literal au lieu d'un Label?
  2. Serait-il préférable de le faire d'une autre manière?

Merci, voici mon code jusqu'à présent dans 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> 

Je ne suis pas sûr du bit suivant. Ai-je besoin de copier ce code sur chaque page de mon site:? Désolé, je suis nouveau à ASP.NET et je ne suis pas sûr de savoir quoi faire. Qu'est-ce que SiteMaster?

+1

Le 'contrôle LABEL' représente l'élément html

Répondre

3

Réponse à la question 1:

à mon humble avis, il n'a pas d'importance. Je dirais qu'il est plus propre d'utiliser Literal lorsque vous n'avez pas besoin d'une étiquette pointant vers un champ d'un formulaire, mais, bien, la plupart des gens utilisent Label dans tous les cas. Ou envoyez le texte directement avec <% %>.

Réponse à la question 2:

Il n'y a pas besoin d'utiliser des sessions pour cela. Au lieu de cela, utilisez this.Master pour accéder directement à la Masterpage. Vous pouvez ensuite mettre à jour la valeur de l'étiquette de votre page.

Par exemple, faire quelque chose comme:

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

et:

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

Pour répondre à vos dernières questions:

Ai-je besoin de copier ce code sur chaque page de mon site?

Oui.À moins que chaque page hérite d'une classe parente qui hérite de la classe Page.

Qu'est-ce que SiteMaster?

SiteMaster est la classe je ai donné à ma page principale. Il pourrait être Template, Global, ou tout ce que vous voulez.

S'il pourrait être utile, voici un exemple complet de la chose:

Class diagram

Fichier 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> 

Fichier 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) 
     { 
     } 
    } 
} 

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

Fichier 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> 

Fichier 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!"); 
     } 
    } 
} 

Fichier 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> 

Fichier 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."); 
     } 
    } 
} 
+0

Je suis un peu confus et ai mis à jour ma question avec mon code. Pourriez-vous jeter un coup d'oeil? –

+0

@Mark Allison: ici, j'ai édité ma réponse. –

+0

wow bonne réponse! Je n'utilise pas de fichiers code-behind, mais cela fonctionne très bien. Il y a une dernière caractéristique avec laquelle je me bats. Lorsque vous naviguez sur la page des produits, le texte d'état est effacé. J'ai besoin qu'il soit persistant sur plusieurs pages et ne change que si le statut change. Cependant, le texte doit toujours apparaître avec le dernier statut. Quels changements dois-je faire pour mettre en œuvre cela? Merci encore pour votre réponse détaillée, très appréciée. –