Pergunta

Eu tenho um controle de usuário que contém uma GridView. A Gridview possui uma coluna Hyperlinkfield e uma coluna de modelo que contém um controle de hiperlink.

O projeto ASP.NET está estruturado da seguinte forma, com a página padrão.aspx em cada caso usando o controle do usuário.

  • Raiz do aplicativo
    • Controles
      • UserControl com Gridview
    • SystemAdMInFolder
      • Default.aspx
      • Edit.aspx
    • OrganizationAdMinFolder
      • Default.aspx
      • Edit.aspx
    • StandardUserFolder
      • Default.aspx
      • Edit.aspx

Nota: as pastas estão sendo usadas para garantir que o usuário tenha a função correta.

Preciso definir o dataVigateUrlformatString para o campo Hyperlink e o NavigateUrl para que o hiperlink resolva na página Edit.aspx na pasta correspondente.

Se eu definir o URL de navegação para "editar.aspx", o URL no navegador aparece como 'http: // aplicativo Raiz/controles/edit.aspx 'independentemente do diretório de origem.

Não posso usar o operador raiz do aplicativo da web (~/), pois o caminho precisa ser relativo à página atual, não à raiz do aplicativo.

Como posso usar o mesmo controle do usuário em várias pastas e resolver o URL em outra página na mesma pasta?

Nota: a pergunta é fortemente baseada em uma pergunta semelhante por Azhar2000s nos fóruns do ASP.NET Isso corresponde ao meu problema.

Foi útil?

Solução

Ao digitar essa pergunta, deparei -me com uma solução possível e modifiquei ainda mais usando feedback do @thomas.

Mudando Control.ApprelativeTemplatesOrceDirectory altera os caminhos relativos produzidos pelo controle. Eu o defini para um ROOT RELATIL VIRTUAL PATH Para a pasta de solicitações atuais. Agora, quaisquer caminhos relativos no UserControl com devem ser relativos à página solicitada, e não ao caminho do usuário.

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

Outras dicas

Eu o colocaria no evento de carga da grade ou da página como assim:

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

Essa estrutura pressupõe que o URL deve ser diferente por linha com base no DataNavigateUrlField. Se for o mesmo URL para todas as linhas, você pode simplesmente definir o NavigateUrl propriedade na carga. Obviamente, você definiria uma pasta diferente com base na função do usuário.

ADIÇÃO Dado o que você mencionou em seu problema nos comentários, o que eu sugiro é armazenar o relacionamento do dobrador de papéis em algum lugar. Você tem várias opções:

  1. Basta armazenar magicamente as teclas nomeadas em AppSettings (Role_systemAdministradores, Role_organizationAdministrators, etc.) com o nome da pasta para a qual devem ser direcionados. A vantagem dessa abordagem é que ela é simples. A desvantagem é que os dados devem inserir corretamente, não há nada para impedir que alguém mapeie acidentalmente uma função para duas pastas e, quando uma função é adicionada, ele deve ser atualizado em mais um local.

  2. Crie uma configuração de configuração personalizada para armazenar o relacionamento. A vantagem é que você pode garantir que cada função esteja listada apenas uma vez. A desvantagem é que é um código extra, você precisa escrever e, quando uma função é adicionada, você ainda precisa adicionar algo em outro lugar.

  3. Leia o location tags fora do arquivo de configuração. A vantagem é que você pode evitar escrever um valor em mais de um lugar. A desvantagem é que fazer isso será uma tarefa árdua. Você teria que encontrar a primeira tag associada à pasta fornecida na qual o usuário atual recebeu permissão.

  4. Leia os valores fora do banco de dados. A vantagem é que você pode escrever facilmente uma tela de gerenciamento para atualizar os valores. A desvantagem é quando uma função é adicionada, você precisa adicionar algo a um local completamente diferente do aplicativo.

Você ainda definiria as permissões de pastas como está fazendo agora. No entanto, depois de armazenado esse relacionamento, você pode redirecionar a pessoa para a pasta apropriada sem ter um código de forking personalizado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top