Domanda

Ho un controllo utente che contiene un GridView. Il GridView ha sia una colonna HyperLinkField e una colonna modello che contiene un controllo HyperLink.

Il progetto ASP.NET è strutturato come segue, con la pagina Default.aspx in ogni caso utilizzando il controllo utente.

  • Application Root
    • Controlli
      • UserControl con GridView
    • SystemAdminFolder
      • Default.aspx
      • Edit.aspx
    • OrganisationAdminFolder
      • Default.aspx
      • Edit.aspx
    • StandardUserFolder
      • Default.aspx
      • Edit.aspx

Nota:. Le cartelle vengono utilizzati per verificare che l'utente ha il ruolo corretto

Ho bisogno di essere in grado di impostare il DataNavigateUrlFormatString per la HyperLinkField e la NavigateUrl per il collegamento ipertestuale per risolvere alla pagina Edit.aspx nella cartella corrispondente.

Se ho impostato l'URL navigare a "Edit.aspx" l'URL nel browser appare come ' http: // applicazione root / Comandi / Edit.aspx. Indipendentemente dalla directory di origine

Non posso usare l'operatore radice dell'applicazione Web (~ /) in quanto le esigenze di percorso per essere relativo alla pagina corrente, non la radice dell'applicazione.

Come posso utilizzare lo stesso controllo utente in più cartelle e risolvere l'URL a un'altra pagina nella stessa cartella?

Nota: La domanda è fortemente basato fuori una domanda simile da azhar2000s sul asp .net forum che corrisponde il mio problema.

È stato utile?

Soluzione

Durante la digitazione fino a questa domanda mi sono imbattuto in una possibile soluzione e hanno ulteriormente modificato questa utilizzando il feedback da @Thomas.

Control.AppRelativeTemplateSourceDirectory altera i percorsi relativi prodotti dal controllo. Ho impostato ad un radice relativo percorso virtuale per la corrente cartella richieste. Ora eventuali percorsi relativi nel UserControl con essere relativo alla pagina richiesta, piuttosto che il percorso controlli utente.

//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;
}

Altri suggerimenti

Vorrei impostarlo nell'evento Load della griglia o la pagina in questo modo:

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

Tale struttura presume che l'URL deve essere diverso per ogni riga base al DataNavigateUrlField. Se dovesse essere lo stesso URL per tutte le righe, allora si può solo impostare la proprietà NavigateUrl a carico. Ovviamente, è necessario impostare una cartella diversa in base al ruolo dell'utente.

OLTRE Dato quello che hai citato nel tuo problema nei commenti, cosa che suggerisco è la memorizzazione del rapporto da qualche parte Role-Folder. Si dispone di un numero di scelte:

  1. È sufficiente memorizzare chiavi magicamente nominati nel appsettings (Role_SystemAdministrators, Role_OrganizationAdministrators, ecc) con il nome della cartella in cui essi devono essere indirizzate. Il vantaggio di questo approccio è che è semplice. Lo svantaggio è che il mosto dati inseriti correttamente, non c'è nulla da impedire a qualcuno di mappatura accidentalmente un ruolo da due cartelle e quando si aggiunge un ruolo che deve essere aggiornato in un altro luogo.

  2. Crea un ConfigSection personalizzato per memorizzare il rapporto. Il vantaggio è che è possibile garantire che ogni ruolo è elencato solo una volta. Lo svantaggio è che è codice aggiuntivo si deve scrivere e quando si aggiunge un ruolo si devono ancora aggiungere qualcosa in un altro luogo.

  3. Leggi i tag location fuori del file di configurazione. Il vantaggio è che si può evitare di dover scrivere un valore in più di un posto. Lo svantaggio è che facendo questo sarà un lavoro di routine. Dovreste trovare il primo tag associato alla cartella specifica su cui è stato dato l'utente corrente permesso.

  4. Leggi i valori fuori del database. Il vantaggio è che si può facilmente scrivere un display di gestione per aggiornare i valori. Lo svantaggio è quando si aggiunge un ruolo è necessario aggiungere qualcosa in una posizione completamente diversa dell'applicazione.

Si sarebbe ancora impostare le autorizzazioni della cartella, come si sta facendo ora. Tuttavia, una volta che hai questo rapporto memorizzato, è possibile reindirizzare la persona nella cartella appropriata, senza dover codice forking di scrittura personalizzato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top