2010-06-13 2 views
0

Pourquoi je ne peux pas accéder à la propriété publique de MasterPage (MessagePlaceholder) à partir d'autres classes (erreurs)?Comment accéder aux propriétés publiques de MasterPage à partir d'une classe externe?

compilateur d'erreur me donne est « Erreur 1 n'a pas pu être trouvé le type ou le nom namespace « MyMasterPage »(vous manque une directive à l'aide ou une référence d'assemblage?) »

mon code page maître derrière

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class MyMasterPage : System.Web.UI.MasterPage 
{ 
    public string MessagePlaceholder 
    { 
     get { return messagePlaceholder.InnerHtml; } 
     set { messagePlaceholder.InnerHtml = value; } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      messagePlaceholder.InnerHtml = Errors.getMessage(); 
     } 
    } 
} 

mes erreurs classe

public static string getMessage() 
    { 
     HttpContext c = HttpContext.Current; 
     string messageType = ""; 
     if (c.Session["errorMessage"] != null) 
     { 
      messageType = "errorMessage"; 
     } 
     else if (c.Session["successMessage"] != null) 
     { 
      messageType = "successMessage"; 
     } 

     if (!string.IsNullOrEmpty(messageType)) 
     { 
      StringBuilder userMessageSb = new StringBuilder(); 
      userMessageSb.Append(string.Format("<div id=\"{0}\" title=\"{1}\">{2}</div>", messageType, messageType.Replace("Message",string.Empty), c.Session[messageType])); 

      // fix so message will not re-appear 
      c.Session.Remove(messageType); 

      messageType = userMessageSb.ToString(); 
     } 
     return messageType; 
    } 

    public static void setSuccess(string successMessage, bool isRedirect) 
    { 
     HttpContext.Current.Session["successMessage"] = successMessage; 
    } 

    public static void setError(string errorMessage, bool isRedirect) 
    { 
     HttpContext.Current.Session["errorMessage"] = errorMessage; 

     if (!isRedirect) 
     { 
      ((HttpContext.Current.CurrentHandler as System.Web.UI.Page).Master as MyMasterPage).MessagePlaceholder = getMessage(); 
     } 
    } 

Voilà comment je mets l'erreur

if (true) 
    { 
     Errors.setError("this is an error demo", false); 
     return; 
    } 

ou redirect après erreur

if (true) 
    { 
     Errors.setError("yet another error", true); 
     Response.Redirect("~/error.aspx"); 
    } 

Répondre

0

essayer quelque chose comme ça.

Control FindMe = Page.FindControl("MessagePlaceholder") 

if (FindMe != null) 
{ 
    ((Literal)FindMe).Text = getMessage(); 
} 

place sur la page, la (HttpContext.Current.CurrentHandler comme System.Web.UI.Page), ou tout simplement envoyer la valeur Page de votre appel.

Autre meilleur code.

if(FindMe is Literal) 
{ 
    ((Literal)FindMe).Text = getMessage(); 
} 
+0

J'ai mis ici le contrôle Literal comme contrôle, vous devez définir le type de contrôle que vous utilisez sur la page .. peut-être Label? – Aristos