ASP.NET用户控件NavigateUrl的相对路径

时间:2010-04-09 01:53:59

标签: asp.net user-controls relative-path absolute-path

我有一个包含GridView的用户控件。 GridView具有HyperLinkField列和包含HyperLink控件的模板列。

ASP.NET项目的结构如下,每种情况下使用Default.aspx页面使用用户控件。

  • 应用程序根目录
    • 控制
      • 使用GridView的UserControl
    • SystemAdminFolder
      • Default.aspx的
      • Edit.aspx
    • OrganisationAdminFolder
      • Default.aspx
      • Edit.aspx
    • StandardUserFolder
      • Default.aspx的
      • Edit.aspx

注意:文件夹用于确保用户具有正确的角色。

我需要能够为HyperLinkField设置DataNavigateUrlFormatString,并为HyperLink设置NavigateUrl以解析到相应文件夹中的Edit.aspx页面。

如果我将导航网址设置为“Edit.aspx”,则浏览器中的网址会显示为 “http://Application Root / Controls / Edit.aspx”,无论原始目录如何。

我无法使用Web应用程序根运算符(〜/),因为路径需要相对于当前页面而不是应用程序根目录。

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

注意:问题主要基于azhar2000s on the asp.net forums与我的问题相符的类似问题。

2 个答案:

答案 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 鉴于您在评论中提到的问题,我建议将角色 - 文件夹关系存储在某处。你有很多选择:

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

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

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

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

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