2010-04-09 53 views
2

我有一個包含GridView的用戶控件。 GridView具有HyperLinkField列和包含HyperLink控件的模板列。ASP.NET用戶控件的相對路徑NavigateUrl

ASP.NET項目的結構如下,在每種情況下Default.aspx頁面使用用戶控件。

  • 應用程序根目錄
    • 控制
      • 用戶控件與GridView控件
    • SystemAdminFolder
      • Default.aspx的
      • Edit.aspx
    • OrganisationAdminFolder
      • Default.aspx的
      • Edit.aspx
    • StandardUserFolder
      • Default.aspx的
      • Edit.aspx

注意:正在使用這些文件夾來確保用戶具有正確的角色。

我需要能夠爲HyperLinkField設置DataNavigateUrlFormatString,爲HyperLink設置NavigateUrl以解析到相應文件夾中的Edit.aspx頁面。

如果將導航URL設置爲「Edit.aspx」,瀏覽器中的URL將顯示爲 'http://Application Root/Controls/Edit.aspx',而不管始發目錄如何。

作爲路徑必須是相對於當前頁面,而不是應用程序根我不能使用Web應用程序根運算符(〜/)。

如何在多個文件夾中使用相同的用戶控件並將URL解析到同一文件夾中的另一個頁面?

注意:這個問題是強烈基於類似的問題azhar2000s on the asp.net forums匹配我的問題。

回答

4

雖然打字這個問題,我碰到一個可能的解決方案來,並進一步修改這個從@Thomas使用反饋。

更改Control.AppRelativeTemplateSourceDirectory改變了由控制產生的相對路徑。我已經將它設置爲當前請求文件夾的root relative virtual path。現在UserControl中的任何相對路徑都是相對於請求的頁面而不是用戶控制路徑。

//Page Load Event for the User Control 
protected void Page_Load(object sender, EventArgs e) 
{ 
    string rootPath = HttpContext.Current.Request.ApplicationPath; 
    if (!rootPath.EndsWith("/")) 
    { 
     rootPath += "/"; 
    } 

    Uri requestUri = HttpContext.Current.Request.Url; 
    string folderPath = requestUri.AbsolutePath.Remove(0, rootPath.Length); 
    string lastSegment = requestUri.Segments[requestUri.Segments.Length - 1]; 
    folderPath = folderPath.Remove(folderPath.LastIndexOf(lastSegment)); 

    AppRelativeTemplateSourceDirectory = "~/" + folderPath; 
} 
0

我將它設置在網格的Load事件或頁面像這樣:

var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn; 
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}"; 

這種結構假定的網址應爲每基礎上,DataNavigateUrlField行不同。如果它應該是所有行的相同url,那麼只需在Load中設置NavigateUrl屬性即可。顯然,你可以根據用戶的角色設置不同的文件夾。

ADDITION鑑於你在評論中提到的問題,我建議在某處存儲角色 - 文件夾關係。你有多種選擇:

  1. 中的appSettings(Role_SystemAdministrators,Role_OrganizationAdministrators等)的文件夾的名稱簡單地存儲神奇命名鍵,他們應該被定向。這種方法的優點是它很簡單。缺點是必須正確輸入數據,沒有任何措施可以阻止某人意外將角色映射到兩個文件夾,並且在添加角色時必須在一個位置更新角色。

  2. 創建一個自定義的ConfigSection來存儲關係。優點是您可以確保每個角色只列出一次。缺點是你必須編寫額外的代碼,並且添加角色時,你仍然需要在另一個地方添加一些東西。

  3. 閱讀配置文件中的location標籤。優點是您可以避免必須在多個地方編寫值。缺點是做這件事很麻煩。您必須找到與當前用戶獲得權限的給定文件夾關聯的第一個標籤。

  4. 從數據庫中讀取值。優點是您可以輕鬆編寫管理屏幕來更新值。缺點是添加角色時,需要將某些內容添加到應用程序的完全不同的位置。

您仍然可以像現在這樣設置文件夾權限。但是,一旦存儲了這種關係,就可以將該人員重定向到相應的文件夾,而無需編寫自定義分支代碼。

+0

謝謝,這是基於文件夾更改該路徑的一個選項。在一個理想的世界中,用戶控件不需要特定於它正在使用的文件夾的代碼(我的解決方案也沒有完全解決這個問題)。也就是說,我希望能夠將控件放在任何任意頁面中,並始終將鏈接指向與包含頁面相同的文件夾中的Edit.aspx頁面。 – 2010-04-09 02:41:38

+0

@Daniel Ballinger - 每個角色的頁面顯着不同?也就是說,你不能簡單地根據單個頁面中的角色分配功能嗎? – Thomas 2010-04-09 04:58:42

+0

當然,我可以將單獨的頁面修改爲一個。我會失去使用強制訪問限制的單獨文件夾的優勢。我猜這個問題我真正想要的是如何在用戶控件中關於頁面而不是用戶控件路徑創建相對URL路徑。用戶控件的路徑應該與控件所用的頁面無關。 – 2010-04-12 02:27:53