Propósito:
Realize usando o arquivo .cs no MasterPage para substituir o PageBase no projeto.
motivação:
A motivação para escrever este artigo vem de uma reconstrução de projeto. No projeto de arquitetura B/S do .Net Framwork 2.0, foram utilizadas as tecnologias PageBase e MasterPage. Verificou-se que toda vez que a página é acessada, a página acessa PageBase e MasterPage ao mesmo tempo, o que não só causa degradação de desempenho, mas pode até causar problemas na expansão e ajuste futuro da função do projeto. Erros lógicos ocultos.
Aspectos técnicos:
PageBase: Uma tecnologia frequentemente usada no .Net Framework 1.1 para encapsular a mesma funcionalidade de várias páginas. A classe PageBase.cs herda da classe System.Web.UI.Page As páginas da Web no projeto herdam da classe PageBase.cs. Ao substituir o método de inicialização da página na classe base, as funções de negócios em PageBase são chamadas. tais como: parâmetros de url, salvamento de visitas e outras funções (para métodos de implementação específicos, consulte o exemplo oficial da Microsoft duwamishi).
MasterPage: Um novo recurso no .Net Framework 2.0. Inclui fisicamente dois arquivos: arquivo .Master (marcação HTML) e arquivo .cs (código C#). O arquivo .Master implementa o desenho da camada de exibição e o arquivo .cs implementa funções específicas. As páginas da Web que herdam do MasterPage podem herdar o conteúdo da camada de exibição no MasterPage. Para desenhar um cabeçalho e rodapé comuns e personalizar um layout unificado, MasterPage é uma boa escolha.
Requisitos de simulação:
Use a tecnologia MasterPage para substituir o PageBase para implementar a verificação de parâmetros da barra de endereço.
Vamos dar uma explicação simples. As informações da tabela Login no banco de dados são as seguintes:
Após o login no sistema, existem parâmetros na barra de endereço da url, como segue:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Neste momento, o usuário modifica manualmente os parâmetros na barra de endereço URL como:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
É considerada uma operação ilegal e o sistema voltará automaticamente para a página de login.
Primeira iteração de código:
1. Consulte o método PageBase tradicional:
A abordagem tradicional da página é:
classe pública PageBase: System.Web.UI.Page
{
publicPageBase()
{
}
/**////
/// Método de entrada
///
vazio protegido Inicializar()
{
//Inserir lógica de negócios comum
}
}
Página da Internet:
classe parcial pública TestPage: PageBase
{
//Método tradicional de chamada de PageBase
/**/////
/// Substitui o método OnPreInit() da classe base e chama o método de verificação geral
///
///
substituição protegida void OnInit (eventargs e)
{
base.Initialize();
}
}
Siga esta abordagem e mova o código do PageBase para o MasterPage:
MasterPage.cs:
classe parcial pública MyMasterPage: System.Web.UI.MasterPage
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
se (!IsPostBack)
{
//Método de verificação de chamada
Inicializar();
}
}
}
Modifique o código na página da web para:
classe parcial pública TestPage: System.Web.UI.Page
{
// Imita o método PageBase e chama o método no Master
/**////
/// Substitui o método OnPreInit() da classe base e chama o método de verificação geral
///
///
substituição protegida void OnInit (eventargs e)
{
// Obtém a referência da página mestra
MinhaPáginaMestre minhaPáginaMestre = (MinhaPáginaMestre)this.Master;
//Chama o método de verificação geral na página mestra
se (!IsPostBack)
{
minhaMasterPage.Initialize();
}
}
}Substitua o método Initialize() em MasterPage pelo método da instância, código de teste:
Passo 1: Faça login no sistema com o nome de usuário zhangsan e o login será bem-sucedido.
A página mostra que zhangsan pode fazer login.
O endereço da URL mostra:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Etapa 2: modifique manualmente a barra de endereço URL: da seguinte maneira:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
A página não exibirá o login de boas-vindas do lisi, mas retornará à página de login.
Reflexão: Embora a função esteja implementada, ainda existem alguns links insatisfatórios:
1. O método chamado pela subclasse em Master deve ser um método público;
2. Embora não haja necessidade de modificar a herança da página da Web, você ainda precisa copiar, colar e substituir mecanicamente o método OnInit() da classe base.
Para eliminar esses sentimentos persistentes, comecei:
Segunda iteração de código:
Modifique o código em MasterPage.cs:
classe parcial pública MyMasterPage: System.Web.UI.MasterPage
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
se (!IsPostBack)
{
//Método de verificação de chamada
VerificarLogin();
}
}
/**////
/// Verifique se o acesso é legal
///
privado vazio CheckLogin()
{
//Se o número na url ou o número no cookie
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//Se o número na url não corresponder ao número no cookie, retorne à página de login
senão if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}Após a reconstrução, a página da Web não pode ser modificada de forma alguma. O MasterPage chama automaticamente o método de verificação em seu próprio método Page_Load() e define o método de verificação como privado, que só pode ser chamado pelo próprio MasterPage para melhorar a segurança. Neste ponto, o código parece ser o teste ideal:
Passo 1: Faça login no sistema com o nome de usuário zhangsan.
A página de login do usuário ainda é exibida.
O teste falhou.
Use pontos de interrupção para rastrear o código e descobrir que o problema ocorre no trecho de código no método CheckLogin() em MasterPage.cs:
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
Como a página de login herda de MasterPage, o método de verificação em MasterPage.cs é chamado automaticamente quando a página é carregada e seus próprios parâmetros não satisfazem o método string.IsNullOrEmpty(), então ele volta para a página de login. a página é carregada novamente. O método de verificação na classe base é chamado, formando assim um loop infinito.
Na tecnologia PageBase, as páginas da Web podem herdar seletivamente do PageBase, mas na tecnologia MasterPage, para obter um efeito de camada de exibição consistente, a seletividade das páginas da Web para herdar MasterPage é muito baixa e não devemos criar a mesma exibição criando um novo, MasterPage sem código de verificação é usado para herdar páginas da Web que não precisam herdar as funções da classe base. Este método é obviamente irracional. Para resolver este problema, foi iniciada a terceira iteração:
Importe o arquivo de configuração:
Como você pode ver, as páginas que precisam ser verificadas são identificadas (needvalidate="true").
Crie uma classe de acesso a dados XML:
classe pública XmlDAL
{
string estática privada filePath = string.Empty;
XmlDAL estático()
{
//Inicializa o caminho do arquivo de configuração
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**////
/// Obtém a lista de páginas que precisam ser verificadas
///
///
public static IList
{
IList
//Se o arquivo de configuração especificado existir
if (System.IO.File.Exists(filePath))
{
tentar
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
// Obtém o nó raiz do arquivo de configuração
Raiz XmlNode = xmlDoc.DocumentElement;
string xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// Coleta de nós de conveniência
foreach (nó XmlNode em nodeList)
{
páginas.Add(node.Attributes["título"].Valor);
}
}
pegar (exceção ex)
{
lançar nova exceção (ex.Mensagem);
}
}
páginas de retorno;
}
}
Refatore o código em MasterPage.cs e adicione o método IsValidateNeeded(string url) para detectar se a página atual requer verificação. Modifique o método de verificação:
classe parcial pública MyMasterPage: System.Web.UI.MasterPage
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
se (!IsPostBack)
{
//Método de verificação de chamada
VerificarLogin();
}
}
/**////
/// Verifique se o acesso é legal
///
privado vazio CheckLogin()
{
// Determina se a página atualmente acessada requer verificação
if (IsValidateNeeded(Request.RawUrl))
{
//Se o número na url ou o número no cookie
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}//Se o número na url não corresponder ao número no cookie, retorne à página de login
senão if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}
/**////
/// Verifica se a página atual requer verificação
///
/// Nome da página atual
///
bool privado IsValidateNeeded(string url)
{
bool é necessário = falso;
// O método GetValidatePages() retorna a lista de páginas que precisam ser verificadas
IList
IEnumerator
while (ou seja,MoveNext())
{
//Se a página atual requer verificação
if (url.Contém(ou seja.Atual))
//Retorna ao status que requer verificação
return isNeeded = verdadeiro;
}
return é necessário;
}
}
Para testar:
Passo 1: Faça login no sistema com o nome de usuário zhangsan e o login será bem-sucedido.
A página mostra que zhangsan pode fazer login.
O endereço da URL mostra:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
Etapa 2: modifique manualmente a barra de endereço URL: da seguinte forma:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
A página não exibirá o login de boas-vindas do lisi, mas retornará à página de login.
Isso conclui minha iteração de código.
Baixar código: