转载 petshop4.0详解

Petshop4.0 超级详细介绍(一)
我们从启始页Default.aspx开始,微软的启始页当然是Default.aspx啦,该页面有一个用户控件NavigationControl 先来说说它,从简单入手嘛
从它的Page_Load事件开始:
protected void Page_Load(object sender, EventArgs e)
{
GetControlStyle();//设置<td>的样式,在webconfig中已经配置了网站的全局样式App_Themes中有它的详细配置资料,在这里进行样式的选择
BindCategories();//这里对Repeater控件进行了绑定,请看BindCategories()方法;
//让它选择了连接会变颜色
string categoryId = Request.QueryString["categoryId"];
            if (!string.IsNullOrEmpty(categoryId))
                SelectCategory(categoryId);
//对网站采用缓存处理,这里可以查看,说的很清楚
DependencyAccess -> TableDependency -> IPetShopCacheDependency
            this.CachePolicy.Dependency = DependencyFacade.GetCategoryDependency();
}
private void BindCategories() {
Category category = new Category();//这里调用BLL(业务逻辑层),对产品的类别进行处理
repCategories.DataSource = category.GetCategories();
//这个方法返回一个IList<CategoryInfo>它的类型为CategoryInfo位于Model项目中该项目有点像与数据库中相对应的表用来放数据便于对数据处理, 使用Ilist将许多CategoryInfo实例放进去
repCategories.DataBind();
                        //这样Repeater控件的绑定就完成了
        }
private static readonly ICategory dal = PetShop.DALFactory.DataAccess.CreateCategory();
//数据抽象工厂不能继承此类,相对应的方法,这样做可以实现动态创建类和调用类型的功能:
public static PetShop.IDAL.ICategory CreateCategory() {
            string className = path + ".Category";
return (PetShop.IDAL.ICategory)Assembly.Load(path).CreateInstance(className);
//这里返回的是SQLServerDAL.Category它继承了Icategory接口因此要实现GetCategories()GetCategory()方法
        }
//这里调用SQLServerDAL.Category.GetCategories()方法
public IList<CategoryInfo> GetCategories() {
            return dal.GetCategories();
        }
//SQLServerDAL.Category.GetCategories()方法
public IList<CategoryInfo> GetCategories() {
IList<CategoryInfo> categories = new List<CategoryInfo>();
//使用using对SqlDataReader自动释放
using(SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_CATEGORIES, null)) {
                while (rdr.Read()) {
                   CategoryInfo cat = new CategoryInfo(rdr.GetString(0), rdr.GetString(1), rdr.GetString(2));
                    categories.Add(cat);
                }
            }
            return categories;
        }
昨天说到了Default.aspx页面今天来讲Products.aspx页面,该页面由有一个母版页和一个用户控件组成。
其中的用户控件中只包涵了一个CustomList自定义控件它继承至DataList 并实现分页
public event DataGridPageChangedEventHandler PageIndexChanged;
override public object DataSource {
            set {
                    try {
                    dataSource = (IList)value;   
//非泛型列表的基接口,避免用户将没有继承Icollection的类型传递进来如int型之类的。
                     ItemCount = dataSource.Count; //获取dataSource中元素的数量
                }
                catch {
dataSource = null;
ItemCount = 0;
                }
            }
        }
//重写BaseDataList.OnLoad()方法
override protected void OnLoad(EventArgs e) {
            if (Visible) {
                string page = Context.Request[KEY_PAGE];
                int index = (page != null) ? int.Parse(page) : 0;           
                SetPage(index); //初始化NewPageIndex属性
            }
        }
public void SetPage(int index) {
            OnPageIndexChanged(new DataGridPageChangedEventArgs(null, index));
        }
//如果PageIndexChanged事件不为空则执行相对应的方法
virtual protected void OnPageIndexChanged(DataGridPageChangedEventArgs e) {
            if (PageIndexChanged != null)
                PageIndexChanged(this, e);
        }
ProductsControl.ascx控件的Page_Load中
this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();////在我的前一篇文章中有介绍
现在来说说它的母版页MasterPage.master它的里面包涵了一个BreadCrumbControl用户控件用来实现产品的导航。其他的都是常用的web控件
接着与Products.aspx相关联的Items.aspx用来显示产品它主要由ItemsControl.ascx用户控件组成包含一个继承Repeater的自定义控件CustomGrid内部代码和CustomList差不多。
<tr class="itemText">
<td colspan="2"><asp:HyperLink ID="lnkCart" runat="server" NavigateUrl='<%#string.Format("~/ShoppingCart.aspx?addItem={0}", Eval("Id")) %>' SkinID="lnkCart"></asp:HyperLink></td>
                     </tr>
                     <tr class="itemText">
                          <td colspan="2"><asp:HyperLink ID="lnkWishList" runat="server" NavigateUrl='<%# string.Format("~/WishList.aspx?addItem={0}", Eval("Id")) %>' SkinID="lnkWishlist"></asp:HyperLink></td>
                     </tr>

 

 

Petshop4.0 超级详细介绍(三)
      ShoppingCart.aspx中Profile提供的功能是针对用户的个性化服务。在ASP.NET 1.x版本时,我们可以利用SessionCookie等方法来存储用户的状态信息。然而Session对象是具有生存期的,一旦生存期结束,该对象保留的值就会失效。Cookie将用户信息保存在客户端,它具有一定的安全隐患,一些重要的信息不能存储在Cookie中。一旦客户端禁止使用Cookie,则该功能就将失去应用的作用。
Profile的出现解决了如上的烦恼,它可以将用户的个人化信息保存在指定的数据库中。ASP.NET 2.0Profile功能默认支持Access数据库和SQL Server数据库,如果需要支持其他数据库,可以编写相关的ProfileProvider类。Profile对象是强类型的,我们可以为用户信息建立属性,以PetShop 4.0为例,它建立了ShoppingCartWishListAccountInfo属性。
<properties>
                   <addname="ShoppingCart"type="PetShop.BLL.Cart"allowAnonymous="true"provider="ShoppingCartProvider"/>
                   <addname="WishList"type="PetShop.BLL.Cart"allowAnonymous="true"provider="WishListProvider"/>
                   <addname="AccountInfo"type="PetShop.Model.AddressInfo"allowAnonymous="false"provider="AccountInfoProvider"/>
</properties>
在我们为web.config配置文件中对Profile进行配置后,启动Web应用程序,ASP.NET会根据该配置文件中的相关配置创建一个ProfileCommon类的实例(单步调试可以看到创建ProfileCommon)。该类继承自System.Web.Profile.ProfileBase类。然后调用从父类继承来的GetPropertyValueSetPropertyValue方法,检索和设置配置文件的属性值。然后,ASP.NET将创建好的ProfileCommon实例设置为页面的Profile属性值。因而,我们可以通过智能感知获取ProfileShoppingCart属性,同时也可以利用ProfileCommon继承自ProfileBase类的Save()方法,根据属性值更新Profile的数据源。
可选的 Boolean 属性。指定是否启用匿名标识。如果为 true,则使用 Cookie(或没有 Cookie 的值)来管理用户的匿名标识符。默认值为 false。
<anonymousIdentificationenabled="true"/>
在有些情况下,您的应用程序最初可能维护着匿名用户的个性化设置信息,但最后该用户登录到了您的应用程序中。在这种情况下,该用户的标识会从分配的匿名用户标识更改为身份验证进程提供的标识。
当用户登录(即不再是匿名用户)时,将引发 MigrateAnonymous 事件。如果有必要,可以对此事件进行处理,以便将信息从用户的匿名标识迁移到新的通过身份验证的标识。下面的代码示例演示用户通过身份验证时如何迁移信息。
void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs e) {
        ProfileCommon anonProfile = Profile.GetProfile(e.AnonymousID);
foreach (CartItemInfo cartItem in anonProfile.ShoppingCart.CartItems)
             Profile.ShoppingCart.Add(cartItem);
        foreach (CartItemInfo cartItem in anonProfile.WishList.CartItems)
            Profile.WishList.Add(cartItem);
// Clean up anonymous profile
        ProfileManager.DeleteProfile(e.AnonymousID);
        AnonymousIdentificationModule.ClearAnonymousIdentifier();
       // Save profile
        Profile.Save();
    }
ASP.NET 使用此方法利用在 ASP.NET 应用程序配置文件 (Web.config) 中指定的属性值初始化 SqlProfileProvider
public override void Initialize(string name, NameValueCollection config) {
if(config == null)
         throw new ArgumentNullException("config");
      if(string.IsNullOrEmpty(config["description"])) {
          config.Remove("description");
          config.Add("description", "Pet Shop Custom Profile Provider");
              }
if(string.IsNullOrEmpty(name))
         name = "PetShopProfileProvider";
     if(config["applicationName"] != null&& !string.IsNullOrEmpty(config["applicationName"].Trim()))                      
          applicationName = config["applicationName"];
base.Initialize(name, config);
}
posted on 2008-09-23 17:16 潜心编程 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zlbBlog/archive/2008/09/23/1297274.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值