如何从外部类访问MasterPage的公共属性?

问题描述:

为什么我不能从其他类(错误)访问MasterPage的公共属性(MessagePlaceholder)?

Why i can't access MasterPage's public property (MessagePlaceholder) from other Class (Errors) ?

错误编译器给出的错误消息是错误1找不到类型或名称空间名称'MyMasterPage'(您是否缺少using指令或程序集引用?)"

Error compiler gives me is "Error 1 The type or namespace name 'MyMasterPage' could not be found (are you missing a using directive or an assembly reference?)"

我的母版页代码后面

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

我的错误类别

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

这是我设置错误的方式

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

或在错误后重定向

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

尝试类似的方法.

Control FindMe = Page.FindControl("MessagePlaceholder")

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

放置在页面上,(将HttpContext.Current.CurrentHandler作为System.Web.UI.Page),或仅从调用中发送Page值.

Place on Page, the (HttpContext.Current.CurrentHandler as System.Web.UI.Page), or just send the Page value from your call.

其他更好的代码.

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