上一个贴还没贴完哦
就是那个div+css的margin缩进~~

解决方案 »

  1.   

    重构之后,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/