Ruta relativa desde un control de usuario de ASP.NET NavigateUrl
user-controls relative-path (2)
Lo configuraría en el evento Load de la grilla o la página así:
var hyperlinkColumn = this.GridView1.Columns[0] as HyperLinkColumn;
hyperlinkColumn.DataNavigateUrlFormatString = "~/SystemAdminFolder/{0}";
Esta estructura presupone que la URL debe ser diferente por fila en función del DataNavigateUrlField
. Si debe ser la misma url para todas las filas, puede establecer la propiedad NavigateUrl
en Load. Obviamente, establecería una carpeta diferente en función del rol del usuario.
ADICIÓN Dado lo que ha mencionado en su problema en los comentarios, lo que sugiero es almacenar la relación Rol-Carpeta en algún lugar. Usted tiene una serie de opciones:
Simplemente almacene las claves con nombre mágico en las configuraciones de la aplicación (Role_SystemAdministrators, Role_OrganizationAdministrators, etc.) con el nombre de la carpeta a la que deben dirigirse. La ventaja de este enfoque es que es simple. La desventaja es que los datos deben ingresarse correctamente, no hay nada que impida que alguien asigne accidentalmente un rol a dos carpetas y cuando se agrega un rol debe actualizarse en un lugar más.
Cree una sección de configuración personalizada para almacenar la relación. La ventaja es que puede asegurarse de que cada rol solo aparezca una vez. La desventaja es que es un código adicional que debe escribir y, cuando se agrega una función, debe agregar algo en otro lugar.
Lee las etiquetas de
location
del archivo de configuración. La ventaja es que puede evitar tener que escribir un valor en más de un lugar. La desventaja es que hacer esto será una tarea ardua. Tendría que encontrar la primera etiqueta asociada a la carpeta en la que se le dio permiso al usuario actual.Lea los valores de la base de datos. La ventaja es que puede escribir fácilmente una pantalla de administración para actualizar los valores. La desventaja es que cuando se agrega un rol, debe agregar algo a una ubicación completamente diferente de la aplicación.
Aún así establecería los permisos de la carpeta como lo está haciendo ahora. Sin embargo, una vez que tenga esta relación almacenada, puede redirigir a la persona a la carpeta apropiada sin tener que escribir código de bifurcación personalizado.
Tengo un control de usuario que contiene un GridView. El GridView tiene una columna HyperLinkField y una columna de plantilla que contiene un control HyperLink.
El proyecto ASP.NET está estructurado de la siguiente manera, con la página Default.aspx en cada caso utilizando el control de usuario.
- Raíz de la aplicación
- Controles
- UserControl con GridView
- SystemAdminFolder
- Default.aspx
- Edit.aspx
- OrganisationAdminFolder
- Default.aspx
- Edit.aspx
- StandardUserFolder
- Default.aspx
- Edit.aspx
- Controles
Nota: Las carpetas se utilizan para garantizar que el usuario tenga el rol correcto.
Necesito poder configurar DataNavigateUrlFormatString para HyperLinkField y NavigateUrl para que HyperLink se resuelva en la página Edit.aspx en la carpeta correspondiente.
Si configuro la URL de navegación como "Editar.aspx", la URL en el navegador aparece como '' http: // Root / Controls / Edit.aspx'' de la aplicación, independientemente del directorio de origen.
No puedo usar el operador raíz de la aplicación web (~ /) ya que la ruta debe ser relativa a la página actual, no a la raíz de la aplicación.
¿Cómo puedo usar el mismo control de usuario en varias carpetas y resolver la URL a otra página en la misma carpeta?
Nota: La pregunta se basa fuertemente en una pregunta similar de azhar2000s en los foros de asp.net que coincide con mi problema.
Mientras escribía esta pregunta encontré una posible solución y la modifiqué usando los comentarios de @Thomas.
Cambiar Control.AppRelativeTemplateSourceDirectory altera las rutas relativas producidas por el control. Lo configuré en una ruta virtual relativa a la raíz para la carpeta de solicitudes actual. Ahora, cualquier ruta relativa en UserControl será relativa a la página solicitada en lugar de la ruta de control del usuario.
//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;
}