2011-12-22 58 views
2

这可能是一个很蹩脚的问题,我对ASP.Net缺乏了解。在这种情况下,链接到文章解释将是非常受欢迎的。在ASP.NET中共享几页之间共同功能的方法

我正在使用C#作为代码隐藏在ASP.NET上的网站上工作。我目前的项目涉及开发功能非常类似的几页,许多功能都是一样的。例如

​​

在2页上是相同的。其他一些事情也是一样的。我想把它放到共同的基类中。但也有不真正属于网页的所有其他功能:

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

我想这迁入Attachment类,但要获得应用程序的物理路径,我需要在Request对象传递进入该方法,这并不是很好,因为它将Attachment类与Page.Request对象结合在一起。

有没有什么办法可以将这些功能移到别的地方而不需要通过Page.Request对象?

p.s.应用程序是巨大的,并且没有改变整个架构的余地。

+0

你仍然可以把它放在Attachment类中;附件类的方法可以是:私人静态字符串GetAttachmentTempPath(字符串appPhysicalPath) - 那么你可以简单地从你的项目中的任何地方调用它 - 字符串attachmentTempPath = GetAttachmentTempPath(Request.PhysicalApplicationPath);这样,用于处理附件的代码全都存在于attacment类中,但是当您需要时将实际的数据传递给它(您在初始化类时甚至可以执行此操作)。 – dash

+0

传递对象实际上*低*耦合比依靠HttpContext,恕我直言。 – sq33G

+0

顺便说一句,如果您使用的网站项目微软的官方建议是:http://msdn.microsoft.com/en-us/library/t990ks23.aspx – dash

回答

2

您的许可的事情你可以做一个基本页面类:

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

现在你可以实现你的页面这样class MyOtherPage : BasePage { ... } 的OnInit中被执行每次您MyOtherPage被加载。

你可以看到一个完整的页面生命周期的位置:Link

您的其他问题:考虑到实现全球可用的静态工具类

更新

一个好的方法制作之类的东西web.config更容易访问是一个Singleton。在asp.net中,一个单例只创建一次,直到asp工作进程停止。所以这个值在整个asp.net应用程序中共享。这也有利于存储在全球范围内的数据,你不希望得到你的数据库或任何时候提交用户进行页面请求(例如一个版本号或类似的东西)

更新2

为了不把它传递给每个函数访问请求时,使用此:

HttpContext.Current.Request 
+0

是的,我想到了继承。但该应用程序有大约50页,并且其中每个页面都会有不同的权限/其他功能。我只能幸运地拥有这两个具有相同权限和功能的页面。我会考虑如何适应这一点。谢谢。至于静态工具类,有几个,但是如何避免将'Request'对象传入该类? – trailmax

+1

@trailmax也许你应该考虑在你的应用程序中实现一个角色系统。有关请求对象的问题,请再次查看我的更新的答案。 – Grrbrr404

+0

角色系统是下一年要做的事情。感谢更新 – trailmax

2

基地页面在页面级别可重用的代码一个不错的选择。除了配置值之类的东西外,最好还是专门为这些方法提供实用程序类,以避免出现类型的操作。 如果你需要避免传递Page对象为这些类型的实用方法,

HttpContext 

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

+0

AHA! HttpContext - 那是我失踪。非常感谢! – trailmax