Относительный путь от пользовательского элемента управления ASP.NET NavigateUrl
-
25-09-2019 - |
Вопрос
У меня есть пользовательский элемент управления, содержащий GridView.GridView имеет столбец HyperLinkField и столбец шаблона, содержащий элемент управления HyperLink.
Проект ASP.NET структурирован следующим образом: страница Default.aspx в каждом случае использует пользовательский элемент управления.
- Корень приложения
- Элементы управления
- Пользовательский контроль с GridView
- папка системного администратора
- По умолчанию.aspx
- Редактировать.aspx
- ОрганизацияАдминистраторПапка
- По умолчанию.aspx
- Редактировать.aspx
- Стандартная папка пользователя
- По умолчанию.aspx
- Редактировать.aspx
- Элементы управления
Примечание:Папки используются для обеспечения того, чтобы пользователь имел правильную роль.
Мне нужно иметь возможность установить DataNavigateUrlFormatString для HyperLinkField и NavigateUrl для HyperLink, чтобы разрешить страницу Edit.aspx в соответствующей папке.
Если для URL-адреса навигации задано значение "Edit.aspx", URL-адрес в браузере отображается как 'http://Приложение Root/Controls/Edit.aspx» независимо от исходного каталога.
Я не могу использовать корневой оператор веб-приложения (~/), поскольку путь должен указываться относительно текущей страницы, а не корня приложения.
Как я могу использовать один и тот же пользовательский элемент управления в нескольких папках и разрешить URL-адрес другой страницы в той же папке?
Примечание:Вопрос в значительной степени основан на аналогичном вопросе azhar2000s на форумах asp.net это соответствует моей проблеме.
Решение
При наборе этого вопроса я нашел одно возможное решение и дополнительно изменил это, используя обратную связь от @thomas.
Изменение Control.apreelativetemPlateSourceirectore изменяет относительные пути, произведенные контролем. Я установил это на Корень относительный виртуальный путь Для текущей папки запросов. Теперь любые относительные пути в 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;
}
Другие советы
Я бы установил его в событии Load сетки или страницы следующим образом:
var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn;
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}";
Эта структура предполагает, что URL-адрес должен быть разным для каждой строки в зависимости от DataNavigateUrlField
.Если это должен быть один и тот же URL-адрес для всех строк, вы можете просто установить NavigateUrl
недвижимость в Load.Очевидно, что вы должны установить другую папку в зависимости от роли пользователя.
ДОБАВЛЕНИЕ Учитывая то, что вы упомянули в своей проблеме в комментариях, я предлагаю где-нибудь сохранить связь между ролью и папкой.У вас есть несколько вариантов:
Просто сохраните ключи с магическими именами в настройках приложения (Role_SystemAdministrators, Role_OrganizationAdministrators и т. д.) с именем папки, в которую их следует направить.Преимущество этого подхода в том, что он прост.Недостаток в том, что данные должны быть введены правильно, ничто не помешает кому-то случайно сопоставить роль с двумя папками, а при добавлении роли ее необходимо обновить еще в одном месте.
Создайте пользовательский ConfigSection для хранения отношений.Преимущество состоит в том, что вы можете гарантировать, что каждая роль будет указана только один раз.Недостаток в том, что вам придется писать дополнительный код, а при добавлении роли вам все равно придется что-то добавлять в другом месте.
Прочтите
location
теги из файла конфигурации.Преимущество состоит в том, что вам не придется записывать значение более чем в одном месте.Недостаток в том, что сделать это будет рутинной работой.Вам нужно будет найти первый тег, связанный с данной папкой, на которую текущему пользователю было дано разрешение.Считайте значения из базы данных.Преимущество состоит в том, что вы можете легко написать экран управления для обновления значений.Недостаток в том, что при добавлении роли вам нужно добавить что-то совершенно в другое место приложения.
Вы по-прежнему будете устанавливать разрешения для папок, как делаете это сейчас.Однако, как только вы сохраните эти отношения, вы сможете перенаправить человека в соответствующую папку без необходимости писать собственный код разветвления.