Pregunta

Tengo un control de usuario que contiene un GridView.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, y la página Default.aspx utiliza en cada caso el control de usuario.

  • Raíz de la aplicación
    • Control S
      • Control de usuario con GridView
    • Carpeta SystemAdmin
      • Predeterminado.aspx
      • Editar.aspx
    • Carpeta de administración de la organización
      • Predeterminado.aspx
      • Editar.aspx
    • Carpeta de usuario estándar
      • Predeterminado.aspx
      • Editar.aspx

Nota:Las carpetas se utilizan para garantizar que el usuario tenga el rol correcto.

Necesito poder configurar DataNavigateUrlFormatString para HyperLinkField y NavigateUrl para HyperLink para resolver en la página Edit.aspx en la carpeta correspondiente.

Si configuro la URL de navegación en "editar.aspx", la URL en el navegador aparece como 'http://Aplicación Root/Controls/Edit.aspx' 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 en 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 eso coincide con mi problema.

¿Fue útil?

Solución

Mientras escribía esta pregunta, encontré una posible solución y la modifiqué aún más utilizando los comentarios de @Thomas.

Cambiando Control.AppRelativeTemplateSourceDirectory altera las rutas relativas producidas por el control.Lo he configurado en un 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 a la ruta de los controles 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;
}

Otros consejos

Lo configuraría en el evento Load de la grilla o de la página así:

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

Esta estructura supone que la URL debe ser diferente por fila según la DataNavigateUrlField.Si debe ser la misma URL para todas las filas, entonces puede configurar la NavigateUrl propiedad en Carga.Obviamente, establecería una carpeta diferente según la función del usuario.

SUMA Dado lo que mencionó en su problema en los comentarios, lo que sugiero es almacenar la relación Función-Carpeta en algún lugar.Tienes varias opciones:

  1. Simplemente almacene claves con nombres mágicos en appSettings (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 una función a dos carpetas y cuando se agrega una función, debe actualizarse en un lugar más.

  2. Cree una ConfigSection personalizada para almacenar la relación.La ventaja es que puede asegurarse de que cada función solo aparezca una vez.La desventaja es que lo que tienes que escribir es código adicional y cuando se agrega un rol todavía tienes que agregar algo en otro lugar.

  3. Leer el location etiquetas fuera del archivo de configuración.La ventaja es que puedes 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 con la carpeta dada en la que se le dio permiso al usuario actual.

  4. Lea los valores de la base de datos.La ventaja es que puedes escribir fácilmente una pantalla de gestión para actualizar los valores.La desventaja es que cuando se agrega una función, es necesario agregar algo a una ubicación completamente diferente de la aplicación.

Aún deberías configurar los permisos de carpeta como lo estás haciendo ahora.Sin embargo, una vez que haya almacenado esta relación, puede redirigir a la persona a la carpeta adecuada sin tener que escribir un código de bifurcación personalizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top