Относительный путь от пользовательского элемента управления ASP.NET NavigateUrl - PullRequest
2 голосов
/ 09 апреля 2010

У меня есть пользовательский элемент управления, который содержит GridView. GridView имеет как столбец HyperLinkField, так и столбец шаблона, содержащий элемент управления HyperLink.

Проект ASP.NET структурирован следующим образом: в каждом случае страница Default.aspx использует пользовательский элемент управления.

  • Приложение Root
    • Управление
      • UserControl с GridView
    • SystemAdminFolder
      • Default.aspx
      • Edit.aspx
    • OrganisationAdminFolder
      • Default.aspx
      • Edit.aspx
    • StandardUserFolder
      • Default.aspx
      • Edit.aspx

Примечание. Папки используются для обеспечения правильной роли пользователя.

Мне нужно иметь возможность установить DataNavigateUrlFormatString для HyperLinkField и NavigateUrl для HyperLink для разрешения на странице Edit.aspx в соответствующей папке.

Если я установил URL-адрес навигации в «Edit.aspx», то URL-адрес в браузере будет отображаться как 'http://Application Root / Controls / Edit.aspx' независимо от исходного каталога.

Я не могу использовать корневой оператор веб-приложения (~ /), поскольку путь должен быть относительно текущей страницы, а не корня приложения.

Как я могу использовать один и тот же пользовательский элемент управления в нескольких папках и разрешить URL-адрес другой страницы в той же папке?

Примечание: вопрос основан на аналогичном вопросе azhar2000s на форумах asp.net , который соответствует моей проблеме.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2010

При наборе этого вопроса я наткнулся на одно возможное решение и дополнительно изменил его, используя обратную связь от @ 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;
}
0 голосов
/ 09 апреля 2010

Я бы установил его в событии Load сетки или страницы следующим образом:

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

Эта структура предполагает, что URL-адрес должен быть разным для каждой строки в зависимости от DataNavigateUrlField. Если он должен быть одинаковым для всех строк, тогда вы можете просто установить свойство NavigateUrl в Load. Очевидно, вы бы установили другую папку в зависимости от роли пользователя.

ДОПОЛНЕНИЕ Учитывая то, что вы упомянули в своей проблеме в комментариях, я предлагаю где-то хранить отношения Роль-Папка. У вас есть несколько вариантов:

  1. Просто сохраните ключи с волшебным именем в appSettings (Role_SystemAdministrators, Role_OrganizationAdministrators и т. Д.) С именем папки, в которую они должны быть направлены. Преимущество такого подхода в том, что он прост. Недостатком является то, что данные должны быть введены правильно, ничто не мешает кому-то случайно назначить роль двум папкам, и при добавлении роли ее необходимо обновить еще в одном месте.

  2. Создайте пользовательский ConfigSection для хранения отношений. Преимущество состоит в том, что вы можете гарантировать, что каждая роль указана только один раз. Недостатком является то, что вам нужно написать дополнительный код, и когда добавляется роль, вам все равно нужно что-то добавить в другом месте.

  3. Считайте теги location из файла конфигурации. Преимущество состоит в том, что вы можете избежать необходимости записывать значения в более чем одном месте. Недостатком является то, что делать это будет рутиной. Вам нужно будет найти первый тег, связанный с данной папкой, для которой у текущего пользователя есть разрешение.

  4. Считать значения из базы данных. Преимущество заключается в том, что вы можете легко написать экран управления для обновления значений. Недостатком является то, что при добавлении роли вам нужно добавить что-то в совершенно другое место приложения.

Вы по-прежнему устанавливаете разрешения для папок, как вы делаете сейчас. Однако после сохранения этих отношений вы можете перенаправить пользователя в соответствующую папку, не вводя пользовательский код разветвления.

...