2011-12-22 63 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