ASP.NET 用户控件 NavigateUrl 的相对路径
-
25-09-2019 - |
题
我有一个包含 GridView 的用户控件。GridView 具有 HyperLinkField 列和包含 HyperLink 控件的模板列。
ASP.NET 项目的结构如下,每种情况下的 Default.aspx 页面都使用用户控件。
- 应用根目录
- 控制
- 带有 GridView 的用户控件
- 系统管理文件夹
- 默认.aspx
- 编辑.aspx
- 组织管理文件夹
- 默认.aspx
- 编辑.aspx
- 标准用户文件夹
- 默认.aspx
- 编辑.aspx
- 控制
笔记:这些文件夹用于确保用户具有正确的角色。
我需要能够设置 HyperLinkField 的 DataNavigateUrlFormatString 和 HyperLink 的 NavigateUrl 以解析到相应文件夹中的 Edit.aspx 页面。
如果我将导航URL设置为“ edit.aspx”,则浏览器中的URL将显示为'http://申请 Root/Controls/Edit.aspx' 无论原始目录如何。
我无法使用 Web 应用程序根运算符 (~/),因为路径需要相对于当前页面,而不是应用程序根。
如何在多个文件夹中使用相同的用户控件并将 URL 解析到同一文件夹中的另一个页面?
笔记:这个问题很大程度上基于类似的问题 asp.net 论坛上的 azhar2000s 这符合我的问题。
解决方案
在输入这个问题时,我遇到了一个可能的解决方案,并使用@Thomas 的反馈进一步修改了它。
改变 Control.AppRelativeTemplateSourceDirectory 改变控件生成的相对路径。我已将其设置为 根相对虚拟路径 对于当前的请求文件夹。现在,用户控件中的任何相对路径都相对于请求的页面而不是用户控件路径。
//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;
}
其他提示
我会在网格或页面的 Load 事件中设置它,如下所示:
var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn;
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}";
该结构假定每行的 Url 应根据 DataNavigateUrlField
. 。如果所有行的 url 应该相同,那么您只需设置 NavigateUrl
加载时的属性。显然,您将根据用户的角色设置不同的文件夹。
添加 鉴于您在评论中提到的问题,我建议将角色文件夹关系存储在某处。您有多种选择:
只需将神奇命名的键及其应定向到的文件夹的名称存储在 appSettings 中(Role_SystemAdministrators、Role_OrganizationAdministrators 等)即可。这种方法的优点是简单。缺点是数据必须正确输入,没有什么可以阻止有人意外地将角色映射到两个文件夹,并且添加角色时必须在另一个位置进行更新。
创建自定义 ConfigSection 来存储关系。优点是可以确保每个角色只列出一次。缺点是您必须编写额外的代码,并且添加角色时您仍然需要在其他位置添加一些内容。
阅读
location
标记出配置文件。优点是您可以避免在多个地方写入一个值。缺点是这样做会很麻烦。您必须找到与当前用户被授予权限的给定文件夹关联的第一个标签。从数据库中读取值。优点是您可以轻松编写管理屏幕来更新值。缺点是添加角色时,您需要将某些内容添加到应用程序的完全不同的位置。
您仍然可以像现在一样设置文件夹权限。但是,一旦存储了此关系,您就可以将该人员重定向到适当的文件夹,而无需编写自定义分叉代码。