小弟在研究petshop过程中遇到了几个问题,不解。希望在研究中的人,或者了解其中原理的人能给些答复,大家相互学习学习,在下先此谢过~
以下主要是在web这个项目中的一些问题,若遇其他问题以后补充。1、 看看ProductsControl.ascx.cs这个第一行就来了个  this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();这里的this.CachePolicy.Dependency在MSDN里的是解析为:“组合 ASP.NET 应用程序的 Cache 对象中存储的项和 CacheDependency 对象的数组之间的多个依赖项。无法继承此类。”,页面的代码为<%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>,那么问题是这个缓存控件ID分别为page及categoryId,这两个ID在这页面中找不到,那这两个分别代表什么?这个DependencyFacade.GetProductDependency()这个读出来的值好像也不是读值productsList所绑定的数据,那么productsList的数据是从哪里读取来绑定的?2、  使用Items.aspx,ItemsControl.ascx是他加截的用户控件,打开ItemsControl.ascx.cs可以发现没有用Page_Load(),那么它第一次是怎么去加载数据的? 3、 ShoppingCart.aspx页面中使用的是Page_PreInit去加载。为什么不用Page_Load?ShoppingCartControl.ascx的用户控件使用的是Page_PreRender而也为什么不用Page_Load?4、用户页面SingIn.aspx只用了一个Login控件。也没有SingIn.aspx.cs去写如何验证的代码,这里是用到什么方法去做这个验证的工作的?注册用户是怎么去注册的?他们都没有逻辑代码,只是用个简单的控件,就可以不经逻辑代码而直接写入数据库,都是只是配置一下配置文件就可以完成了。那如果不是与之相对应的数据库那不就要重写逻辑代码了?暂时研究到这个页面,之后的还没研究,但问题太多,想先解决前面的这些再往下研究,希望能得到解答.
希望答者能以相关编号进行回答,分不够会再加

解决方案 »

  1.   

    ps看过的人不多,看过并能看懂的人就更少,看懂还会逛csdn的人就更少更少,看懂逛csdn还会回答你那么多问题的人...不知道有没有...
      

  2.   

    第一:
    如果做过需要动态更新缓存就知道缓存的依赖项有什么作用。简单的讲就是当缓存依赖项改变则缓存更新。
    第二:
    不是所有的页面都需要Page_Load事件的,信息的加载只是很小一部分用Page_Load.虽然我们大部分程序写在Page_Load里面。Cs这个类的属性,变量会加载的。另外使用这个控件的其他地方也可以控制其属性。
    第三:
    看页面的生命周期你就知道了,各个事件的激发是有顺序的,Page_Load只是其中的一个环节,Page_Load不是万能的,什么事件都放在里面就可以了。
    第四:
    PetShop4代码充斥者大量的设计模式,用普通的面向过程的方法去看的确头疼,去熟悉一下几种面向对象的设计模式特别是工厂方法,你就能理解了。
      

  3.   

    回答你第四个问题,这个验证是用了net2.0xinzeng功能
    membership,具体用法查资料http://www.cnblogs.com/smallfa/archive/2008/03/10/1098990.html,
    其它你说的那几个页面都没有印象了,时间太长了
      

  4.   

    第一个太常了看不下去...第二个:很正常啊,用户控件是控件又不是页面...引用的页面后台代码有Page_load就可以了。第三个:百度一下Page_Init与Page_load的区别,很多这样的文章。第四个:既然是控件就肯定有属性...肯定有连接数据源的属性...ps...不到一定程度没必要看它。
      

  5.   

    1、 看看ProductsControl.ascx.cs这个第一行就来了个  this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();这里的this.CachePolicy.Dependency在MSDN里的是解析为:“组合 ASP.NET 应用程序的 Cache 对象中存储的项和 CacheDependency 对象的数组之间的多个依赖项。无法继承此类。”,页面的代码为 <%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>,那么问题是这个缓存控件ID分别为page及categoryId,这两个ID在这页面中找不到,那这两个分别代表什么?这个DependencyFacade.GetProductDependency()这个读出来的值好像也不是读值productsList所绑定的数据,那么productsList的数据是从哪里读取来绑定的? 2、  使用Items.aspx,ItemsControl.ascx是他加截的用户控件,打开ItemsControl.ascx.cs可以发现没有用Page_Load(),那么它第一次是怎么去加载数据的? 3、 ShoppingCart.aspx页面中使用的是Page_PreInit去加载。为什么不用Page_Load?ShoppingCartControl.ascx的用户控件使用的是Page_PreRender而也为什么不用Page_Load? 4、用户页面SingIn.aspx只用了一个Login控件。也没有SingIn.aspx.cs去写如何验证的代码,这里是用到什么方法去做这个验证的工作的?注册用户是怎么去注册的?他们都没有逻辑代码,只是用个简单的控件,就可以不经逻辑代码而直接写入数据库,都是只是配置一下配置文件就可以完成了。那如果不是与之相对应的数据库那不就要重写逻辑代码了? 回答:
    1.VaryByParam表示GET或 POST 名称/值对的字符串。如果不使用该属性,可是设置为none。
    Page;categoryId
    意思就是 页面和categoryId 更新时候 缓存就更新啊 
    2.控件 可以建立属性 在 调用页面去更改  因为可能 每次空间属性不同 如果在Page_Load里面 耦合不就大了
    3.Page_Preinit 是动态加载控件 加载视图 回发数据的东西 这里我就不详细说了 你可以去看看  页面事件
    4.他都使用了Login 为什么还要去验证 Login 就是把TextBox 封装好 用Membership 管理他的啊
    Login 提供的属性 可以设置验证 就不必要用验证控件  使用Membership 就是为了方便用户 提供统一的登录系统
    封装好了所有功能
      

  6.   

    3、 ShoppingCart.aspx页面中使用的是Page_PreInit去加载。为什么不用Page_Load?因为MS希望ShoppingCart.aspx在另外的页面中也被加载,而不必写多余的代码
      

  7.   


    1、ProductsControl.ascx这里面的ID名为categoryId的控件,只有<a href='Items.aspx?productId=<%# Eval("Id") %>&categoryId=<%# Eval("categoryId") %>'>像这个的参数名,难道这里也能去做缓存?
    2、这个现在有点看得明白是因为自定义了一个productsList控件,这个控件是继承了DataList去做页面加载的~~
    3、这几个页面的生命周期写习惯了的都一般只用个Page_Load,但在petshop写得很灵活,我查了一下,发现很少人会去写这个生命周期的文章,只不过都是点一点,大多只是指明一个时间加载的前后关系,但很少写出他的好处作用,所以为也是我搞得不太明白的地方~
    4、总感觉这个login控件用得太死了,如果是换了数据库,或者想添加字段那么这一个会很不方便,如果将membership的字段名称改一下以便与其他数据相结合,那么我要怎么去做这个验证?所以就不知道他是怎么去做这个验证了~
      

  8.   

    1.页面是同一个 但是要显示不同的产品 所以就可以使用categoryId 作为缓存一句  缓存的话可以是数组 数据库 页面 控件id== 甚至一个引用类型
    2.
    3.事件 的话  我最近正在写一个 完美的教学博文  不久就发布到cnblogs 呵呵
    4.将membership的字段名称改一下===
    那就要重新 Membership 他是继承自 MembershipBase 之类的东东  然后要重新
    你看petshop里面的 ORacle  好麻烦 
    我这次做项目 也在考虑 是不是要重写  后来想了下还是用profile 去加其他属性吧
    不过如果时间可以
    你可以完全开发自己的web服务器登录控件 
    如果你打算重新 去下个 providerToolkit.msi后面忘记了 MS的provider 类
      

  9.   

    to10楼:bhtfg538 
    有点看得明白了。
    1、不过都比较模糊~各个知识点理解得不太多,就像缓存这里你说可以是数组,数据库,页面,控件id等等,那么这里应该就是指定了page页面,那么他为什么还要指定了一个categoryId?页面不是都包括了全部了?他这里为什么不直接用个none就行了?
    4、如果像你这么说那么login基本上就是使用mssql时才有点用,如果在access或者其他数据库,那还不如自己写个登录控件,那么login基本上就可以废了~不实用啊~写得也太麻烦!
      

  10.   

    <%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>第一个参数是定义了控件的过期时间,第二个参数则定义了区分缓存的参数(2.0新特性),然后查看 ProductsControl.ascx.cs文件你会发现在protected void PageChanged方法中有productsList.DataSource = product.GetProductsByCategory(categoryKey);语句,这个语句是直接使用DAL访问数据库,(没有先查询缓 存,这也是很多人百思不得其解的地方)但是关键不在这里,在protected void Page_Load方法中有一行语句this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();这条语句的作用就在于将SqlCacheDependency同样应 用于页面的缓存过期。这样一来,缓存的就不光是数据实体类而已,而是整个控件被Render出来后的html!这样一来还省去了每次访问页面时的Render操作,效率显然比光缓存实体类高得多!ps: 如果你想使用光缓存实体类的方式,那么请删除ascx文件中的OutputCache声明,注释掉page_load中的过期策略语句,然后将 productsList.DataSource = product.GetProductsByCategory(categoryKey);改为productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);其他页面同理操作