ASP.NET技巧:用MasterPage 代替 PageBase 上一个贴还没贴完哦就是那个div+css的margin缩进~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 重构之后,Web页可以不进行任何修改,MasterPage在自身的Page_Load()方法中自动调用验证方法,而且将验证方法设置为private,仅供MasterPage自身调用,提高安全性。至此,代码似乎比较理想了,测试: 步骤一:用 用户名 zhangsan登录系统, 依然显示用户登录页面。 测试失败。用断点跟踪代码,发现问题出现在MasterPage.cs中的CheckLogin()方法中的代码片段:if (string.IsNullOrEmpty(Request.QueryString["id"]) || string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id"))){ Response.Redirect("Login.aspx");}由于登录页继承自MasterPage,所以页面加载时自动调用MasterPage.cs中的验证方法,而自身的参数又不满足string.IsNullOrEmpty()方法,于是又跳回到登录页面,登录页面在再次在加载时调用基类中的验证方法,于是形成死循环。在PageBase 技术中,Web页面可以有选择的继承自PageBase,而MasterPage技术中,为了获得一致的显示层效果,Web页面对继承 MasterPage的选择性是非常底的,而且我们也不应该采用新建相同显示,不带有验证代码的MasterPage,来给不需要继承基类功能的Web页面来继承,这种方式显然不合理。为了解决这个问题,于是开始了第三次迭代: 引入配置文件:<?xml version="1.0" encoding="utf-8" ?><pages> <testpage> <page title="TestPage" url="TestPage.aspx" needvalidate="true"/> <page title="Login" url="Login.aspx" needvalidate="false"/> </testpage> <adminpages> <page title="Page1" url="~/Admin/Page1.aspx" needvalidate="false"/> <page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/> </adminpages></pages>从中可以看到,将需要验证的页面加以标识(needvalidate="true")。创建Xml数据访问类:public class XmlDAL{ private static string filePath = string.Empty; static XmlDAL() { // 初始化配置文件路径 filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml"); } /**//// <summary> /// 获得需要验证的页面列表 /// </summary> /// <returns>需要验证的页面列表</returns> public static IList<string> GetValidatePages() { IList<string> pages = new List<string>(); // 如果指定配置文件存在 if (System.IO.File.Exists(filePath)) { try { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(filePath); // 获取配置文件根节点 XmlNode root = xmlDoc.DocumentElement; string xpath = "/pages/testpage/page[@needvalidate='true']"; XmlNodeList nodeList = root.SelectNodes(xpath); // 便利节点集合 foreach (XmlNode node in nodeList) { pages.Add(node.Attributes["title"].Value); } } catch (Exception ex) { throw new Exception(ex.Message); } } return pages; }}重构MasterPage.cs中的代码,加入IsValidateNeeded(string url)方法,用于检测当前页面是否需要验证,修改验证方法:public partial class MyMasterPage : System.Web.UI.MasterPage{ protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 调用验证方法 CheckLogin(); } } /**//// <summary> /// 验证访问是否合法 /// </summary> private void CheckLogin() { // 判断当前访问页面是否需要进行验证 if (IsValidateNeeded(Request.RawUrl)) { // 如果 url中的编号 或 cookie中的编号 if (string.IsNullOrEmpty(Request.QueryString["id"]) || string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id"))) { Response.Redirect("Login.aspx"); }// 如果url中的编号 和 cookie中的编号 不匹配,返回登录页 else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id"))) { Response.Redirect("Login.aspx"); } } } /**//// <summary> /// 验证当前页是否需要验证 /// </summary> /// <param name="currentPage">当前页面名称</param> /// <returns>是否需要验证状态</returns> private bool IsValidateNeeded(string url) { bool isNeeded = false; // GetValidatePages() 方法返回需要验证页面列表 IList<string> pages = XmlDAL.GetValidatePages(); IEnumerator<string> ie = pages.GetEnumerator(); while (ie.MoveNext()) { // 如果当前页面需要进行验证 if (url.Contains(ie.Current)) // 返回需要验证状态 return isNeeded = true; } return isNeeded; }}进行测试: 步骤1:用 用户名zhangsan登录系统,登录成功, 页面显示 欢迎 zhangsan 登录。 url地址显示: http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001 步骤2:手动修改url地址栏:如下: http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002 页面不会显示 欢迎lisi登录,而是跳转回登录页面。 至此代码迭代结束。 http://www.cnblogs.com/ vs2008 编译成功,iis 6.0发布出错,急! Page_Load 不执行 特别急 请问网上银行支付服务的接口问题 哪位高手用过ASPXGRID 控件吗? 为什么修改后的数据不能存入数据库 调用informix出现在的问题 把对象序列化后存到cookie里该怎么做? datagrid to excel problem 后台管理前台logo问题 配置Web.config的问题 关于Msxml2.FreeThreadedDOMDocument? framework1.1和2.0不兼容,ajax运行报错 10天学会ASP.net之第五天
步骤一:用 用户名 zhangsan登录系统,
依然显示用户登录页面。
测试失败。
用断点跟踪代码,发现问题出现在MasterPage.cs中的CheckLogin()方法中的代码片段:
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
由于登录页继承自MasterPage,所以页面加载时自动调用MasterPage.cs中的验证方法,而自身的参数又不满足string.IsNullOrEmpty()方法,于是又跳回到登录页面,登录页面在再次在加载时调用基类中的验证方法,于是形成死循环。
在PageBase 技术中,Web页面可以有选择的继承自PageBase,而MasterPage技术中,为了获得一致的显示层效果,Web页面对继承 MasterPage的选择性是非常底的,而且我们也不应该采用新建相同显示,不带有验证代码的MasterPage,来给不需要继承基类功能的Web页面来继承,这种方式显然不合理。为了解决这个问题,于是开始了
第三次迭代:
引入配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<pages>
<testpage>
<page title="TestPage" url="TestPage.aspx" needvalidate="true"/>
<page title="Login" url="Login.aspx" needvalidate="false"/>
</testpage>
<adminpages>
<page title="Page1" url="~/Admin/Page1.aspx" needvalidate="false"/>
<page title="Page2" url="~/Admin/Page2.aspx" needvalidate="false"/>
</adminpages>
</pages>
从中可以看到,将需要验证的页面加以标识(needvalidate="true")。
创建Xml数据访问类:
public class XmlDAL
{
private static string filePath = string.Empty;
static XmlDAL()
{
// 初始化配置文件路径
filePath = HttpContext.Current.Request.MapPath("~/App_Data/xml/" + "Pages.xml");
}
/**//// <summary>
/// 获得需要验证的页面列表
/// </summary>
/// <returns>需要验证的页面列表</returns>
public static IList<string> GetValidatePages()
{
IList<string> pages = new List<string>();
// 如果指定配置文件存在
if (System.IO.File.Exists(filePath))
{
try
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
// 获取配置文件根节点
XmlNode root = xmlDoc.DocumentElement;
string xpath = "/pages/testpage/page[@needvalidate='true']";
XmlNodeList nodeList = root.SelectNodes(xpath);
// 便利节点集合
foreach (XmlNode node in nodeList)
{
pages.Add(node.Attributes["title"].Value);
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
return pages;
}
}
重构MasterPage.cs中的代码,加入IsValidateNeeded(string url)方法,用于检测当前页面是否需要验证,修改验证方法:
public partial class MyMasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 调用验证方法
CheckLogin();
}
}
/**//// <summary>
/// 验证访问是否合法
/// </summary>
private void CheckLogin()
{
// 判断当前访问页面是否需要进行验证
if (IsValidateNeeded(Request.RawUrl))
{
// 如果 url中的编号 或 cookie中的编号
if (string.IsNullOrEmpty(Request.QueryString["id"])
|| string.IsNullOrEmpty(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}// 如果url中的编号 和 cookie中的编号 不匹配,返回登录页
else if (int.Parse(Request.QueryString["id"]) != int.Parse(CookieUtil.ReadCookieByKey("id")))
{
Response.Redirect("Login.aspx");
}
}
}
/**//// <summary>
/// 验证当前页是否需要验证
/// </summary>
/// <param name="currentPage">当前页面名称</param>
/// <returns>是否需要验证状态</returns>
private bool IsValidateNeeded(string url)
{
bool isNeeded = false;
// GetValidatePages() 方法返回需要验证页面列表
IList<string> pages = XmlDAL.GetValidatePages();
IEnumerator<string> ie = pages.GetEnumerator();
while (ie.MoveNext())
{
// 如果当前页面需要进行验证
if (url.Contains(ie.Current))
// 返回需要验证状态
return isNeeded = true;
}
return isNeeded;
}
}
进行测试:
步骤1:用 用户名zhangsan登录系统,登录成功,
页面显示 欢迎 zhangsan 登录。
url地址显示:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1001
步骤2:手动修改url地址栏:如下:
http://localhost:3730/MasterPageBaseDemo/TestPage.aspx?id=1002
页面不会显示 欢迎lisi登录,而是跳转回登录页面。 至此代码迭代结束。 http://www.cnblogs.com/