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

StackOverflow https://stackoverflow.com/questions/2604636

Вопрос

У меня есть пользовательский элемент управления, содержащий 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.Очевидно, что вы должны установить другую папку в зависимости от роли пользователя.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top