Master's的Master's方法.净c#

本文关键字:Master 方法 | 更新日期: 2023-09-27 18:02:05


我正在尝试为我们公司的内部网应用程序做一个错误处理方法。该错误显示在带有asp:label控件的页面中。当我做内联编码时,它很好,但是当我尝试将代码放在母版页的方法中时,它不起作用。我得到一个编译错误。下面是方法(在master.cs文件中):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _BASE_MASTER : System.Web.UI.MasterPage
{
    public void AddError(string strWhen, string strMessage)
    {
        lblAlert.Text += "<p>" + "Une erreur s'est produite " + strWhen + "<br/>'" + strMessage + "'</p>";
        lblAlert.RenderControl(new HtmlTextWriter(Response.Output));
    }
}

还没有麻烦…它工作,如果我在第一个内容页:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _BASE_SECTEUR_BASE : System.Web.UI.MasterPage
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ((_BASE_MASTER)Master).AddError("TEST", "TEST2");
    }
}

这很奇怪,它给出了一个小错误,但它工作(我通常不会在加载事件中使用它)。

它在第二页不起作用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class _BASE_SECTEUR_Default : System.Web.UI.Page
{
    bool errorOccured = false;
    [...]
        }
        catch (Exception e)
        {
            if (!errorOccured)
            {
                ((_BASE_MASTER)((_BASE_SECTEUR_BASE)Master).Master).AddError("lors de l'acquisition du code congé.", e.Message);
                errorOccured = true;
            }
        }
    [...]
}

'_BASE_MASTER'在这个上下文中不存在,尽管看起来一切正常。我已经试了几个小时了,但我似乎找不到解决办法。也许有人能帮忙?

更多精度:

我使用2个母版页:

  • 一个使页面看起来相似(_BASE_MASTER),
  • 一个做一些改变(如标题)在网站的子部分(_BASE_SECTEUR_BASE)。

我也检查了,再三检查,再三检查页面之间的链接。没有'AddError'方法调用,一切正常。

Master's的Master's方法.净c#

如果你想在母版页中调用一个方法,你可以这样做:

// Level0 Master Page
public partial class Root : System.Web.UI.MasterPage
{
    public void AddError(string strWhen, string strMessage)
    {
        lblAlert.Text += "<p>" + "Une erreur s'est produite " + strWhen + "<br/>'" + strMessage + "'</p>";
    }
}
// Level1 Master Page
public partial class OneColumn : System.Web.UI.MasterPage
{
    public void AddError(string strWhen, string strMessage)
    {
        ((Root)Master).AddError(strWhen, strMessage);
    }
}
// Content Page
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ((OneColumn)Master).AddError("test", "test");
    }
}

我终于找到了一个解决方法。这是我个人的解决方案。

/// <summary>
/// Fonctions de gestion d'erreurs personnalisées.
/// </summary>
public class ErrorHandler
{
    static string errLog = HttpContext.Current.Server.MapPath("~/Logs/errors.log");
    /// <summary>
    /// Affiche dans la page qu'une erreur s'est produite et l'indique dans un
    /// journal.
    /// Utiliser seulement si l'erreur est récupérable.
    /// </summary>
    /// <param name="strWhen">Complète la chaîne "Une erreur s'est produite ".
    /// Un "." sera ajouté après. Ex : "lors du chargement du calendrier"</param>
    /// <param name="strMessage">Le message d'erreur de l'exception. Sera encadré
    /// d'apostrophes.</param>
    static public void AddPageError(string strWhen, string strMessage)
    {
        string strPrefixe = "Une erreur s'est produite ";
        string strPage = HttpContext.Current.Request.Url.AbsolutePath;
        MasterPage mpMaster = ((Page)HttpContext.Current.Handler).Master;
        using (TextWriter errFile = new StreamWriter(errLog, true))
        {
            errFile.WriteLine(DateTime.Now.ToString() + " - (" + strPage + ") - " + strPrefixe + strWhen + " : '" + strMessage + "'");
        }
        Label lblAlert = (Label)((Page)HttpContext.Current.Handler).FindControl("lblAlert");
        // La boucle suivante sert à remonter les master page pour vérifier si un Label avec un id lblAlert existe.
        while (lblAlert == null)
        {
            if (mpMaster == null)
                return;
            lblAlert = (Label)mpMaster.FindControl("lblAlert");
            mpMaster = mpMaster.Master;
        }
        // On ne veut pas continuer si le Label n'existe pas : Des erreurs se produiraient.
        if (lblAlert == null)
            return;
        if (lblAlert.Text == "")
        {
            lblAlert.Text = "<p><i>Cliquez pour faire disparaître.</i></p>";
        }
        lblAlert.Text += "<p>" + strPrefixe + strWhen + ".<br/>'" + strMessage + "'</p>";
        lblAlert.BorderWidth = Unit.Parse("0.3em");
        lblAlert.RenderControl(new HtmlTextWriter(HttpContext.Current.Response.Output));
    }
}

现在我只需要打电话ErrorHandler.AddPageError("", "");从任何地方调用我的错误