我有一个包含GridView的用户控件。 GridView具有HyperLinkField列和包含HyperLink控件的模板列。
ASP.NET项目的结构如下,每种情况下使用Default.aspx页面使用用户控件。
注意:文件夹用于确保用户具有正确的角色。
我需要能够为HyperLinkField设置DataNavigateUrlFormatString,并为HyperLink设置NavigateUrl以解析到相应文件夹中的Edit.aspx页面。
如果我将导航网址设置为“Edit.aspx”,则浏览器中的网址会显示为 “http://Application Root / Controls / Edit.aspx”,无论原始目录如何。
我无法使用Web应用程序根运算符(〜/),因为路径需要相对于当前页面而不是应用程序根目录。
如何在多个文件夹中使用相同的用户控件并将URL解析为同一文件夹中的其他页面?
注意:问题主要基于azhar2000s on the asp.net forums与我的问题相符的类似问题。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
我会将它设置在网格的Load事件或页面中,如下所示:
var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn;
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}";
此结构假设根据DataNavigateUrlField
,每行的Url应该不同。如果它对于所有行应该是相同的url,那么您可以在Load上设置NavigateUrl
属性。显然,您可以根据用户的角色设置不同的文件夹。
ADDITION 鉴于您在评论中提到的问题,我建议将角色 - 文件夹关系存储在某处。你有很多选择:
只需在appSettings(Role_SystemAdministrators,Role_OrganizationAdministrators等)中存储神奇命名的密钥,并使用其应定向的文件夹的名称。这种方法的优点是它很简单。缺点是必须正确输入数据,没有什么可以阻止某人意外地将角色映射到两个文件夹,并且当添加角色时,必须在另一个地方更新。
创建自定义ConfigSection以存储关系。优点是您可以确保每个角色仅列出一次。缺点是它是你必须编写的额外代码,当添加一个角色时,你仍然需要在另一个地方添加一些东西。
从配置文件中读取location
标签。优点是您可以避免在多个位置写入值。缺点是这样做将是一件苦差事。您必须找到与当前用户被授予权限的给定文件夹关联的第一个标记。
从数据库中读取值。优点是您可以轻松编写管理屏幕来更新值。缺点是当添加角色时,您需要将某些内容添加到应用程序的完全不同的位置。
您仍然可以像现在一样设置文件夹权限。但是,一旦存储了此关系,您就可以将此人重定向到相应的文件夹而无需编写自定义分叉代码。