在ASP.NET中几页分享共同功能的方法

时间:2011-12-22 11:08:55

标签: c# asp.net architecture

这可能是非常蹩脚的问题,我对ASP.Net缺乏了解。在这种情况下,非常欢迎链接到文章解释。

我正在使用C#作为代码隐藏在ASP.NET上的网站上工作。我目前的项目涉及开发几个具有非常相似功能的页面,并且许多功能都是相同的。例如

private void PermissionCheck()
{
    if (null == Session["UserID"] ||
        null == Session["ProjectID"] ||
        null == Session["AssetID"] ||
        null == Session["ProjectName"])
    {
        Response.Redirect("~/Login.aspx");
    }
 }

在2页上会是相同的。其他一些事情也是一样的。我想把它放到普通的基类中。但是还有其他功能根本不属于页面:

private string GetAttachmentTempPath()
{
    return Request.PhysicalApplicationPath + WebConfigurationManager.AppSettings.Get("AttachmentsTempFolder");
}

我想把它移到Attachment类中,但是要获取应用程序的物理路径,我需要将Request对象传递给该方法,这不是很好,因为它耦合{{1带有Attachment对象的类。

有没有办法将这些函数移动到其他地方而不需要传递Page.Request个对象?

P.S。应用程序非常庞大,无法改变整个架构。

3 个答案:

答案 0 :(得分:2)

为了您的许可,您可以制作基页类:

class BasePage : Page
{ 
   ...
   protected override OnInit() {
     // do check here
   }
}

现在您可以像class MyOtherPage : BasePage { ... }一样实施您的网页 每次加载MyOtherPage时都会执行OnInit。

您可以在此处查看完整的页面生命周期:Link

针对您的其他问题:考虑实施全局可用的静态工具类

<强>更新

使像web.config这样的东西更容易访问的好方法是Singleton。在asp.net中,单例只创建一次,直到asp工作进程停止为止。所以这个值在整个asp.net应用程序中共享。这也适用于将数据存储在全局上下文中,您不希望在用户发出页面请求时(例如版本号或类似事件)从数据库或文件中获取数据

更新2

要访问请求而不将其传递给每个函数,请使用:

HttpContext.Current.Request

答案 1 :(得分:2)

基页是页面级别中可重用代码的一个很好的选择。除了像配置值这样的东西之外,最好专门针对这些方法设置实用程序类。 如果您需要避免将Page对象传递给这些类型的实用程序方法,

HttpContext

类会很方便,因为你可以通过这个类通过静态成员访问许多ASP.Net对象。 HttpConext @ MSDN

答案 2 :(得分:1)

如果您在页面后面有类似功能,则可以使用ASP.NET WEb User Control

您可以在usercontrol中创建函数,并在必要时在页面中使用该控件。

请查看有关Web User Control in Asp.Net

的文章