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()
{
}
/**//// <resumo>
/// Método de entrada
/// </sumário>
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
/**///// <resumo>
/// Substitui o método OnPreInit() da classe base e chama o método de verificação geral
/// </sumário>
/// <param name="e"></param>
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
/**//// <resumo>
/// Substitui o método OnPreInit() da classe base e chama o método de verificação geral
/// </sumário>
/// <param name="e"></param>
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();
}
}
/**//// <resumo>
/// Verifique se o acesso é legal
/// </sumário>
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:
<?xml versão="1.0" codificação="utf-8" ?>
<páginas>
<página de teste>
<page title="TestPage" url="TestPage.aspx" needvalidate="true"/>
<page title="Login" url="Login.aspx" needvalidate="false"/>
</testpage>
<páginas de administração>
<page title="Página1" url="~/Admin/Page1.aspx" needvalidate="false"/>
<page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/>
</adminpages>
</páginas>
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");
}
/**//// <resumo>
/// Obtém a lista de páginas que precisam ser verificadas
/// </sumário>
/// <returns>Lista de páginas que requerem verificação</returns>
public static IList<string> GetValidatePages()
{
IList<string> páginas = new List<string>();
//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();
}
}
/**//// <resumo>
/// Verifique se o acesso é legal
/// </sumário>
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");
}
}
}
/**//// <resumo>
/// Verifica se a página atual requer verificação
/// </sumário>
/// <param name="currentPage">Nome da página atual</param>
/// <returns>Se o status precisa ser verificado</returns>
bool privado IsValidateNeeded(string url)
{
bool é necessário = falso;
// O método GetValidatePages() retorna a lista de páginas que precisam ser verificadas
IList<string> páginas = XmlDAL.GetValidatePages();
IEnumerator<string> ou seja = pages.GetEnumerator();
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: