从母版页访问BasePage

时间:2014-08-01 19:28:55

标签: asp.net webforms master-pages

我在母版页代码隐藏中动态添加自定义控件:

try
{
    // Add custom sidenav menu control dynamically
    SideNavMenu sidenav = new SideNavMenu();

    tempPath = Request.RawUrl.ToLower();
    path = tempPath.Contains(@"/sitename") ? tempPath.Substring(7) : tempPath;

    sidenav.MenuPath = path;
    menuPlaceHolder.Controls.Add(sidenav);
}
catch
{
    // Handle this - custom error form and email
    // Master page needs access to base page LogError method

}

这是带有ErrorLog()方法的基页,它实际上会生成一封电子邮件:

public partial class BasePage : System.Web.UI.Page
{
    public void LogError(Exception error)
    {
        ...
        smtpClient.Send(message);
    }
}

如何从母版页代码隐藏中调用ErrorLog?或者是否有更好的地方放置“常见”ErrorLog方法?有人可以建议正确的语法或更好的方法吗?

2 个答案:

答案 0 :(得分:1)

LogError函数放在App_Code文件夹中的类中,并可能使其成为静态函数。如果它可以通过多个项目重用,那么将它放在一个单独的类库中。您的BasePage课程没有业务实施记录错误和发送电子邮件的详细信息。请记住Separation of Concerns (SoC).

事实上,已经存在一个库来为您执行此操作,称为Elmah

答案 1 :(得分:0)

我强烈推荐NLog用于您的目的。它允许可配置的日志记录,包括通过SMTP。您的代码如下:

using Nlog;

public partial class BasePage : System.Web.UI.Page
{
    private static Logger bpLogger = LogManager.GetCurrentClassLogger();

    public void LogError(Exception error)
    {
        bpLogger.LogException(
            LogLevel.Error,
            "ruh roh",
            error
        );

        ...
        //smtpClient.Send(message);
    }
}

因为NLog非常有效,所以您可以在登录时每页实例化一个私有静态Logger对象。此外,记录器将自动记录它来自哪个类,并且各种配置选项允许您更改记录的位置,记录方式以及记录时间而不更改任何其他代码。

以下是通过SMTP发送错误的配置的链接,例如:

https://github.com/nlog/NLog/wiki/Mail-target

这是一个成熟的项目,已经存在了很长时间,并且随着您的日志记录需求的增长,可以与您的项目一起成长。