2

我有一个包含 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://Application Root/Controls/Edit.aspx”。

我不能使用 Web 应用程序根操作符 (~/),因为路径需要相对于当前页面,而不是应用程序根。

如何在多个文件夹中使用相同的用户控件并将 URL 解析到同一文件夹中的另一个页面?

注意:该问题强烈基于azhar2000s 在与我的问题相匹配的 asp.net 论坛上提出的类似问题。

4

2 回答 2

4

在输入这个问题时,我遇到了一种可能的解决方案,并使用来自@Thomas 的反馈进一步修改了它。

更改Control.AppRelativeTemplateSourceDirectory会更改控件生成的相对路径。我已将其设置为当前请求文件夹的根相对虚拟路径。现在 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;
}
于 2010-04-09T02:04:42.513 回答
0

我会在网格或页面的 Load 事件中设置它,如下所示:

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

此结构假定 Url 基于DataNavigateUrlField. 如果所有行的 url 应该是相同的,那么您可以NavigateUrl在 Load 处设置属性。显然,您将根据用户的角色设置不同的文件夹。

添加鉴于您在评论中提到的问题,我建议将角色文件夹关系存储在某处。您有多种选择:

  1. 只需将神奇命名的键存储在 appSettings(Role_SystemAdministrators、Role_OrganizationAdministrators 等)中,并附上它们应该指向的文件夹的名称。这种方法的优点是简单。缺点是必须正确输入数据,没有什么可以阻止某人意外地将角色映射到两个文件夹,并且添加角色时必须在另一个位置进行更新。

  2. 创建一个自定义 ConfigSection 来存储关系。优点是您可以确保每个角色只列出一次。缺点是你必须编写额外的代码,当添加角色时,你仍然需要在另一个地方添加一些东西。

  3. 从配置文件中读取location标签。优点是您可以避免在多个位置写入值。缺点是这样做会很麻烦。您必须找到与当前用户被授予权限的给定文件夹关联的第一个标签。

  4. 从数据库中读取值。优点是您可以轻松编写管理屏幕来更新值。缺点是添加角色时,您需要将某些内容添加到应用程序的完全不同的位置。

您仍然可以像现在一样设置文件夹权限。但是,一旦您存储了这种关系,您就可以将该人重定向到适当的文件夹,而无需编写自定义分叉代码。

于 2010-04-09T02:15:26.180 回答