匿名淘宝用户匿名查看器怎么注册?

Posts - 78,
Articles - 6,
Comments - 73
12:23 by 淮左, ... 阅读,
在Global.asax全局变量中对匿名用户有进行了处理,我当初也在想,这个匿名用户买了东西,要下单的时候需要登录,登录后它买的东东怎么转换给登录的用户呢?
下面先来看下这段处理代码吧:
1 //将匿名用户转换为注册用户处理 2 void Profile_MigrateAnonymous(Object sender, ProfileMigrateEventArgs e) { 3
ProfileCommon anonProfile = Profile.GetProfile(e.AnonymousID);//获取匿名用户的Profile对象 4
5 // Merge anonymous shopping cart items to the authenticated shopping cart items 6 foreach (CartItemInfo cartItem in anonProfile.ShoppingCart.CartItems) 7
Profile.ShoppingCart.Add(cartItem); 8
9 // Merge anonymous wishlist items to the authenticated wishlist items10 foreach (CartItemInfo cartItem in anonProfile.WishList.CartItems)11
Profile.WishList.Add(cartItem);12 13 // Clean up anonymous profile14 //删除匿名用户信息15
ProfileManager.DeleteProfile(e.AnonymousID);16
AnonymousIdentificationModule.ClearAnonymousIdentifier();//删除匿名用户标识17
18 // Save profile19
Profile.Save();20
这里用到了ProfileCommon这个类,上节我已经对其做了解释,当ASP.NET运行时,他会先创建这个类,它是继承ProfileBase这个基类的。
代码3是用了多态的机制来实例化的。
那么代码行6的anonProfile.ShoppingCart.CartItems这个CartItems应该装载了些什么呢。先不看代码,我猜是要记录匿名用户所购买的Items及相应的Quatitys
和Total。那么是不是这样呢?来看看BLL.Cart这个类吧:
private Dictionary&string, CartItemInfo& cartItems =new Dictionary&string, CartItemInfo&();
BLL.Cart定义了一个私有的字段Dictionary,它是一个泛型集合,跟IList一样是泛型的。从上面的定义我们可以看出Dictionary&TKey,TValue&,的键值Tkey是string类型的itemId,而Tvalue是CartItemInfo类型的CartItemInfo。这样来存储购物车 的信息很方便。
上面的代码应该还好理解吧,之前不理解行6行7,是因为我对Profile还了解不够吧。现在是这样理解的:我们先用已经生产的ProfileCommon这个对象记录匿名用户购买的东东(是CartItemInfo类型的),然后再用Profile吧它转换为注册用户的,这里是Profile可以记录随时记录心注册的用户吧。
然后呢,上面那段代码不是用到了Cart中的Add(CartItemInfo x)函数吗?那么现在就我们来看看这段函数代码是怎么记录我们的购物车信息吧(我做了详细注释了):
publicvoid Add(CartItemInfo item) {
CartItemInfo cartI
if (!cartItems.TryGetValue(item.ItemId, out cartItem))//参数一item.ItemId是键值,
//如果Dictionary包含键值返回true,cartItem应该是返回的值,这里的话应该是ItemId,
//但我不明白cartItem怎么匹配ItemId?否则false。
//这个问题我可能已经明白了,因为如果键值已经存在了,我们就输出了cartItem类型,
//这个应该相当于引用类型,我们再后面的数量添加自然也会添加到字典中了
cartItems.Add(item.ItemId, item);//如果字典中不包含ItemId,将item.ItemId和item添加到词典中else
cartItem.Quantity += item.Q//如果ItemId在字典中可以找到,就更新ItemId对应的宠物数量,//
//但是为什么购物车包含那么都属性,而这里只添加了他的数量呢?
//经过思考,我现在也可能明白为什么只添加数量了,因为你键值既然存在了,
//那么你就有相应的宠物的信息啦,那么你需要知道的是数量有没有变量罢了
我觉得这个购物车是BLL中最有想法的一部分了。
7-19-2011补
那么Profile的匿名用户到底是怎么转换为注册用户的呢?这个转换机制有点复杂,我们的匿名用户是存在于浏览器的Cookie中的,且有一个Profile与其相对应,但这个Profile不写入数据库的,应该只用来做判断的。当你登录后,就会又生成一个Profile了,这个时候要做用户的转换了,就要用到Global.asax这个文件了。那么就是触发这个Profile_MigrateAnonymous事件了,那么这个事件到底是属于哪个类的呢?答案是:ProfileModule类。这些Profile**类与Membership类到底有什么联系呢?不然他们登录的时候就会找到ProfileModule这个类来触发这个事件?待续。如何禁止匿名用户连接你的IPC$共享?_百度知道
如何禁止匿名用户连接你的IPC$共享?
com谢谢支持.msc打开本地安全策略,编辑“计算机配置”--“Windows设置”--“安全设置”--“本地策略”--“安全选项”--“对匿名连接的额外限制”    0.llb168:    0,否则可能会造成你的一些服务无法启动,默认已经启用了“不允许SAM帐户的匿名枚举”:不允许枚举SAM帐号和共享    2;SYSTEM&#47,不建议使用.llb168。    本文来自电脑知识信息网 http://Lsa    Name,但是没有启用“不允许SAM帐户和共享的匿名枚举”;CurrentControlSet&#47:RestrictAnonymous    Type.    也可以执行gpedit://www:匿名用户无法列举主机用户列表:没有显示匿名权限就无法访问    xp和2003中,如SQLServer.:0|1|2    说明;Control/    2:无:REG_DWORD    Value.  我们可以通过修改注册表来实现    Key:HKEY_LOCAL_MACHINE&#47:匿名用户无法连接你的IPS$共享:默认开放    1
其他类似问题
为您推荐:
ipc的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁新浪手机用户怎么注册
为什么我就找不到那个页面呢,而且那个自写短信一下就跳过去了
09-10-12 &匿名提问
没听过联通的可以冲这个
请登录后再发表评论!实名制之后,手机号码已经是用于注册账号的最佳选择(也有政策要求的趋势)。知乎发展到C轮,主要运营追求已经不是用户数量了。作为内容社区,知乎是spam敏感的。手机号码spam成本要高于email,anti-spam反而容易。总的来说,采用哪种注册方式,取决于产品性质、发展阶段和运营策略。哪天改回来也说不定。
&b&先说答案:在回答本问题时&/b&&b&知乎&/b&&b&仍然可以使用电子邮箱注册帐号。&/b&&br&(中间部分为详细解释,如果没有耐心可以看最后部分。)&br&&br&当你尚未登陆知乎,打开知乎的任何一个问题页面,都会看到右上角的:&br&&blockquote&&i&知乎是一个真实的问答社区,在这里分享知识、经验和见解,发现更大的世界。&/i&&br&「&i&使用手机或&b&邮箱注册&/b&&/i&」&/blockquote&&img src=&/eab89b244acf761c6102_b.png& data-rawwidth=&483& data-rawheight=&382& class=&origin_image zh-lightbox-thumb& width=&483& data-original=&/eab89b244acf761c6102_r.png&&这几日,我也一直想注册知乎帐号,但是发现都需要手机号码作为验证途径,令人沮丧的是,我点击右上角的「使用手机或邮箱注册」仍然没有办法使用邮箱注册。&br&我开始怀疑知乎是不是改版后忘记修改「使用手机或邮箱注册」这段话了,况且我也有一些小“洁癖”,很讨厌被社交帐号天天追着发短信、也担心隐私泄露。&br&出于种种原因,我一直处于「只读模式」直到今天早上……今天早上逛知乎,无聊的点击注册后,发现竟然可以使用邮箱注册了!&br&激动万分,立即输入我的 Gmail 邮箱,果然注册成功!直到看到这个问题,我开始反思,&b&「为什么我之前不可以使用邮箱注册?」&/b&&br&经过细致的检查,我发现,我注册知乎的时候正在使用「代理服务器」&i&(代理原理和方法不做任何解释,请善用搜索)&/i&,所以我有一个假设,&b&「知乎使用邮箱注册仅限中国大陆以外地区」&/b&&br&&br&怎么验证呢?很简单,退出帐号,使用代理,重新点开注册页面。&br&结果印证了我的假设,请看图:&br&&img src=&/696cc0c0db63b9d2ca14a_b.jpg& data-rawwidth=&715& data-rawheight=&534& class=&origin_image zh-lightbox-thumb& width=&715& data-original=&/696cc0c0db63b9d2ca14a_r.jpg&&&i&(吐槽下:本来制作了一个动画,才发现知乎竟然不支持 GIF 格式图片!!!)&/i&&br&&br&&b&「具体是什么原因导致了知乎分区域呢?」&/b&&br&这里,我和之前那位匿名的回答者想法一致。&i&(注意以下想法仅是猜测)&/i&&br&实名制政策有可能是主要原因。我去网上一搜,发现 QQ、百度帐号等都需要手机号注册,而大部分网站在 2016 年 1 月份左右开始不能使用邮箱注册。&br&&br&&b&「那么该怎样不使用手机号码从而注册知乎帐号呢?」&/b&&br&方法有以下几种&br&1、在境外 IP 环境下注册(貌似百度等帐号不区分境内境外,强制大陆手机才能注册……)&br&2、使用页面右上角第三方帐号注册(例如 QQ 号码、微博、微信登陆等,大部分网站都有类似支持,很方便)&br&3、开启只读模式(哈哈哈哈~)
先说答案:在回答本问题时知乎仍然可以使用电子邮箱注册帐号。(中间部分为详细解释,如果没有耐心可以看最后部分。)当你尚未登陆知乎,打开知乎的任何一个问题页面,都会看到右上角的:知乎是一个真实的问答社区,在这里分享知识、经验和见解,发现更大的…
到设置里去绑定邮箱、改密码,下次就可以用它们进行登陆了,匿名作答不谢
到设置里去绑定邮箱、改密码,下次就可以用它们进行登陆了,匿名作答不谢
已有帐号?
无法登录?
社交帐号登录posts - 12,&
comments - 46,&
trackbacks - 7
演示环境:Win2003 + Visual Studio 2005 + Sql Server2005,前期需要将MS在Sql2000下的例程数据库Northwind加入Sql Server 2005;注意:操作系统不一定非要Win2003,凡是支持.net FrameWork 2.0的都可
新建一个例程网站,该网站目前结构如下图:
&&&&&&&&&&
这是一个还未使用任何用户管理技术的网站,那么我们下面就从头开始讨论这些技术.
前期页面准备工作如下:
Default.aspx前后台代码如下:
&%@&Page&Language="C#"&AutoEventWireup="true"&CodeFile="Default.aspx.cs"&Inherits="_Default"&%&
&!DOCTYPE&html&PUBLIC&"-//W3C//DTD&XHTML&1.1//EN"&"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&
&html&xmlns="http://www.w3.org/1999/xhtml"&
&head&id="Head1"&runat="server"&
&&&&&title&示例13-3&/title&
&&&&&link&id="InstanceStyle"&href="StyleSheet.css"&type="text/css"&rel="stylesheet"&
&&&&&form&id="form1"&runat="server"&
&&&&&&&&&div&
&&&&&&&&&&&&&fieldset&style="width:&620px"&
&&&&&&&&&&&&&&&&&legend&class="mainTitle"&实现匿名用户向注册用户迁移&/legend&
&&&&&&&&&&&&&&&&&table&border="0"&cellpadding="5"&width="620px"&
&&&&&&&&&&&&&&&&&&&&&tr&
&&&&&&&&&&&&&&&&&&&&&&&&&td&style="font-size:"&当前用户是:&asp:Label&ID="lbUserName"&runat="server"&&/asp:Label&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&/td&
&&&&&&&&&&&&&&&&&&&&&&&&&td&
&&&&&&&&&&&&&&&&&&&&&&&&&asp:LinkButton&ID="lbtLogin"&runat="server"&CssClass="littleTitle"&OnClick="lbtLogin_Click"&登录&/asp:LinkButton&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:LinkButton&ID="lbtLogout"&runat="server"&CssClass="littleTitle"&OnClick="lbtLogout_Click"&退出&/asp:LinkButton&&/td&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&/tr&
&&&&&&&&&&&&&&&&&&&&&tr&
&&&&&&&&&&&&&&&&&&&&&&&&&td&colspan="2"&&hr&/&
&&&&&&&&&&&&&&&&&&&&&&&&&/td&
&&&&&&&&&&&&&&&&&&&&&/tr&
&&&&&&&&&&&&&&&&&&&&&tr&align="center"&
&&&&&&&&&&&&&&&&&&&&&&&&&td&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&p&class="littleTitle"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&待售商品列表&/p&
&&&&&&&&&&&&&&&&&&&&&&&&&/td&
&&&&&&&&&&&&&&&&&&&&&&&&&td&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&p&class="littleTitle"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&购物车&/p&
&&&&&&&&&&&&&&&&&&&&&&&&&/td&
&&&&&&&&&&&&&&&&&&&&&/tr&
&&&&&&&&&&&&&&&&&&&&&tr&
&&&&&&&&&&&&&&&&&&&&&&&&&td&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:SqlDataSource&ID="SqlDataSource1"&runat="server"&ConnectionString="&%$&ConnectionStrings:NorthwindConnectionString&%&"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&SelectCommand="SELECT&[ProductID],&[ProductName],&[UnitPrice]&FROM&[Products]"&&/asp:SqlDataSource&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:GridView&ID="ProductGrid"&runat="server"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Width="300px"&AllowPaging="True"&AutoGenerateColumns="False"&BackColor="White"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&BorderColor="#CC9966"&BorderStyle="None"&BorderWidth="1px"&CellPadding="4"&DataKeyNames="ProductID"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DataSourceID="SqlDataSource1"&Font-Size="Small"&PageSize="5"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FooterStyle&BackColor="#FFFFCC"&ForeColor="#330099"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RowStyle&BackColor="White"&ForeColor="#330099"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Columns&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:CommandField&ButtonType="Image"&SelectImageUrl="~/Images/button_buy.gif"&ShowSelectButton="True"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:BoundField&DataField="ProductName"&HeaderText="商品名称"&SortExpression="ProductName"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:BoundField&DataField="UnitPrice"&DataFormatString="{0:c}"&HeaderText="单价"&SortExpression="UnitPrice"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/Columns&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PagerStyle&BackColor="#FFFFCC"&ForeColor="#330099"&HorizontalAlign="Center"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&SelectedRowStyle&BackColor="#FFCC66"&Font-Bold="True"&ForeColor="#663399"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&HeaderStyle&BackColor="#990000"&Font-Bold="True"&ForeColor="#FFFFCC"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/asp:GridView&
&&&&&&&&&&&&&&&&&&&&&&&&&/td&
&&&&&&&&&&&&&&&&&&&&&&&&&td&valign="top"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:GridView&ID="CartGrid"&AutoGenerateColumns="False"&DataKeyNames="ID"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CellPadding="4"&Width="320px"&runat="Server"&BackColor="White"&BorderColor="#CC9966"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&BorderStyle="None"&BorderWidth="1px"&Font-Size="Small"&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Columns&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:ButtonField&CommandName="select"&Text="Remove"&ButtonType="Image"&ImageUrl="~/Images/button_del.gif"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:BoundField&DataField="Name"&HeaderText="商品名称"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:BoundField&DataField="Price"&HeaderText="单价"&DataFormatString="{0:c}"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:BoundField&DataField="Quantity"&HeaderText="数量"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/Columns&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&FooterStyle&BackColor="#FFFFCC"&ForeColor="#330099"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&RowStyle&BackColor="White"&ForeColor="#330099"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&PagerStyle&BackColor="#FFFFCC"&ForeColor="#330099"&HorizontalAlign="Center"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&SelectedRowStyle&BackColor="#FFCC66"&Font-Bold="True"&ForeColor="#663399"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&HeaderStyle&BackColor="#990000"&Font-Bold="True"&ForeColor="#FFFFCC"&/&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/asp:GridView&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&asp:Label&ID="lblTotal"&runat="Server"&CssClass="littleTitle"&/&&/td&
&&&&&&&&&&&&&&&&&&&&&/tr&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&/table&
&&&&&&&&&&&&&/fieldset&
&&&&&&&&&/div&
&&&&&/form&
Default.aspx.cs
&2using&System.D
&3using&System.C
&4using&System.W
&5using&System.Web.S
&6using&System.Web.UI;
&7using&System.Web.UI.WebC
&8using&System.Web.UI.WebControls.WebP
&9using&System.Web.UI.HtmlC
<span style="color: #
<span style="color: #public&partial&class&_Default&:&System.Web.UI.Page
<span style="color: #{
<span style="color: #&&&&protected&void&Page_Load(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&
<span style="color: #&&&&}
<span style="color: #&&&&protected&void&lbtLogin_Click(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&Response.Redirect("Login.aspx");
<span style="color: #&&&&}
<span style="color: #&&&&protected&void&lbtLogout_Click(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&FormsAuthentication.SignOut();
<span style="color: #&&&&}
<span style="color: #}
<span style="color: #
Login页面的前后代码如下:
Login.aspx
&%@&Page&Language="C#"&AutoEventWireup="true"&CodeFile="Login.aspx.cs"&Inherits="Login"&%&
&!DOCTYPE&html&PUBLIC&"-//W3C//DTD&XHTML&1.1//EN"&"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"&
&html&xmlns="http://www.w3.org/1999/xhtml"&
&head&runat="server"&
&&&&&title&示例13-3&/title&
&&&&&link&id="InstanceStyle"&href="StyleSheet.css"&type="text/css"&rel="stylesheet"&
&&&&&form&id="form1"&runat="server"&
&&&&&&&&&div&
&&&&&&&&&&&&&fieldset&style="width:&260px"&
&&&&&&&&&&&&&&&&&legend&class="mainTitle"&站点登录&/legend&
&&&&&&&&&&&&&&&&&br&/&
&&&&&&&&&&&&&&&&&p&style="font-size:&small"&提示:用户名是Tom,密码是&/p&
&&&&&&&&&&&&&&&&&asp:Login&ID="Login1"&runat="server"&Font-Size="Small"&LoginButtonText="提交"&PasswordLabelText="密码:"&TitleText=""&UserNameLabelText="用户名:"&FailureText="输入不正确."&RememberMeText="下次自动登录"&
&&&&&&&&&&&&&&&&&&&&&TextBoxStyle&Width="150px"&/&
&&&&&&&&&&&&&&&&&&&&&TitleTextStyle&Font-Bold="True"&/&
&&&&&&&&&&&&&&&&&&&&&CheckBoxStyle&HorizontalAlign="Right"&/&
&&&&&&&&&&&&&&&&&/asp:Login&
&&&&&&&&&&&&&/fieldset&
&&&&&&&&&/div&
&&&&&/form&
Login页面没有后台代码,该页面需要用到一个成员用户管理类别的控件:Login1,请注意。
以上就是页面上主要两个页面的设计情况,再就是些样式设计StyleSheet.css和Web.config如下:
StyleSheet.css
&4.mainTitle
&6&&&&font-size:&12pt;
&7&&&&font-weight:&bold;
&8&&&&font-family:&宋体;
<span style="color: #.commonText
<span style="color: #{}{
<span style="color: #&&&&font-size:&11pt;
<span style="color: #&&&&font-family:&宋体;
<span style="color: #}
<span style="color: #.littleTitle
<span style="color: #{}{
<span style="color: #&&&&font-size:&10pt;
<span style="color: #&&&&font-family:&宋体;
<span style="color: #&&&&font-weight:bold;
<span style="color: #}
<span style="color: #
Web.Config
&1&?xml&version="1.0"?&
&3&configuration&xmlns="/.NetConfiguration/v2.0"&
&4&&&&&appSettings/&
&5&&&&&connectionStrings&
&6&&&&&&&&&add&name="NorthwindConnectionString"&connectionString="Data&Source=ROGER;Initial&Catalog=NIntegrated&Security=True"&providerName="System.Data.SqlClient"/&
&7&&&&&/connectionStrings&
&8&&&&&system.web&
&9&&&&&&&&
<span style="color: #&&&&&&&&&authentication&mode="Forms"&
<span style="color: #&&&&&&&&&&&&&forms&loginUrl="Login.aspx"&&/forms&
<span style="color: #&&&&&&&&&/authentication&
<span style="color: #&&&&&&&&
<span style="color: #&&&&&&&&&compilation&debug="true"/&
<span style="color: #&&&&&/system.web&
<span style="color: #&/configuration&
注意:以上数据库连接字符串需要自己配置,这里配置是Windows登录,而且Data Source根据每台机器自己配置。
以上由Web.Config可以看出,此时页面验证方式是Forms。
此时运行Default.aspx页面是可以出现下图左边购物车的数据,该数据来自Northwind数据库,因为界面上通过SqlDataSource控件进行数据沟通的,如下两个图
此时在登录界面(Login.aspx)进行登录是无法实现的,因为此时未引入Profile概念,那么此概念将在下面介绍。
ASP.NET 2.0在处理用户配置信息方面基本抛弃了ASP.NET 1.X的做法,其提供的个性化用户配置功能可以实现将用户配置信息与单个用户关联,并采取持久化方式存储信息。理解这个概念需要注意以下四点:一是配置信息可以是与任何用户有关的信息。二是所存储的信息可以是可以是任何数据类型的对象,比如甚至可以是复杂的自定义数据类型。三是单个用户可以是注册用户,也可以是匿名用户。四是默认情况下,持久存储采用SQL Server数据库方式,并且无需自行创建或维护数据库,这些工作都有ASP.NET 2.0自动完成。
使用个性化用户配置功能主要包括如下两个核心的步骤:首先,配置应用程序以便启用和定义要为用户存储和跟踪的配置信息。这些工作在Web.config文件的&Profile&中轻松完成。然后,使用与用户配置功能有关的强类型API实现对用户配置信息的存储、访问和管理等。
那么,下面先来配置Web.config文件,加入如下代码:
加入Profile配置节的Web.config
&1&?xml&version="1.0"?&
&3&configuration&xmlns="/.NetConfiguration/v2.0"&
&4&&&&&appSettings/&
&5&&&&&connectionStrings&
&6&&&&&&&&&add&name="NorthwindConnectionString"&connectionString="Data&Source=ROGER;Initial&Catalog=NIntegrated&Security=True"&providerName="System.Data.SqlClient"/&
&7&&&&&/connectionStrings&
&8&&&&&system.web&
<span style="color: #&&&&&anonymousIdentification&enabled="true"/&
11&&&&&profile&
12&&&&&&&properties&
13&&&&&&&&&add&name="ShoppingCart"&type="ShoppingCart"&serializeAs="Binary"&allowAnonymous="true"/&
14&&&&&&&/properties&
15&&&&&/profile&
<span style="color: #&&&&
<span style="color: #&&&&&&&&&authentication&mode="Forms"&
<span style="color: #&&&&&&&&&&&&&forms&loginUrl="Login.aspx"&&/forms&
<span style="color: #&&&&&&&&&/authentication&
<span style="color: #&&&&&&&&
<span style="color: #&&&&&&&&&compilation&debug="true"/&
<span style="color: #&&&&&/system.web&
<span style="color: #&/configuration&
注意:上述红色部分代码(10~15行)是新加入的配置节
<span style="color: #行:标注是否需要对匿名用户进行身份记录
Profile节包括&properties&和&providers&两大子配置节,我们先看&properties&,13行此处是我们准备存储的ShoppingCart类,这个类用来记录购物车信息,type="ShoppingCart" 就是指向待会建立的类名叫ShoppingCart,后面二个属性表明这个类是可序列化为二进制,并且运行匿名用户访问的。
下面在App_Code目录下建立ShoppingCart类,代码如下:
ShoppingCart.cs
&2using&System.C
&4[Serializable]
&5public&class&ShoppingCart
&7&&&&public&Hashtable&_CartItems&=&new&Hashtable();
&8&&&&//&创建属性CartItems,用于获取购物车中所有商品
&9&&&&public&ICollection&CartItems
<span style="color: #&&&&{
<span style="color: #&&&&&&&&get&{&return&_CartItems.V&}
<span style="color: #&&&&}
<span style="color: #
<span style="color: #&&&&//&创建属性Total,用于获取购物车中商品总价
<span style="color: #&&&&public&decimal&Total
<span style="color: #&&&&{
<span style="color: #&&&&&&&&get
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&decimal&sum&=&<span style="color: #;
<span style="color: #&&&&&&&&&&&&foreach&(CartItem&item&in&_CartItems.Values)
<span style="color: #&&&&&&&&&&&&{
<span style="color: #&&&&&&&&&&&&&&&&sum&+=&item.Price&*&item.Q
<span style="color: #&&&&&&&&&&&&}&&&&&&&&&&&&
<span style="color: #&&&&&&&&&&&&return&
<span style="color: #&&&&&&&&}
<span style="color: #&&&&}
<span style="color: #&&&&//&实现将商品添加到购物车中
<span style="color: #&&&&public&void&AddItem(int&ID,&string&Name,&decimal&Price)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&CartItem&item&=&(CartItem)_CartItems[ID];
<span style="color: #&&&&&&&&if&(item&==&null)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&_CartItems.Add(ID,&new&CartItem(ID,&Name,&Price));
<span style="color: #&&&&&&&&}&&&&&&&&
<span style="color: #&&&&&&&&else
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&item.Quantity++;
<span style="color: #&&&&&&&&&&&&_CartItems[ID]&=&
<span style="color: #&&&&&&&&}
<span style="color: #&&&&}
<span style="color: #&&&&//&从购物车中删除商品
<span style="color: #&&&&public&void&RemoveItem(int&ID)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&CartItem&item&=&(CartItem)_CartItems[ID];
<span style="color: #&&&&&&&&if&(item&==&null)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&return;
<span style="color: #&&&&&&&&}&&&&&&&&
<span style="color: #&&&&&&&&item.Quantity--;
<span style="color: #&&&&&&&&if&(item.Quantity&==&<span style="color: #)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&_CartItems.Remove(ID);
<span style="color: #&&&&&&&&}
<span style="color: #&&&&&&&&else
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&_CartItems[ID]&=&
<span style="color: #&&&&&&&&}&&&&&&&&
<span style="color: #&&&&}
<span style="color: #}
<span style="color: #
<span style="color: #//实现表示商品的业务实体类
<span style="color: #[Serializable]
<span style="color: #public&class&CartItem
<span style="color: #{
<span style="color: #&&&&private&int&_ID;
<span style="color: #&&&&private&string&_N
<span style="color: #&&&&private&decimal&_P
<span style="color: #&&&&private&int&_Quantity&=&<span style="color: #;
<span style="color: #&&&&//&创建属性ID
<span style="color: #&&&&public&int&ID
<span style="color: #&&&&{
<span style="color: #&&&&&&&&get&{&return&_ID;&}
<span style="color: #&&&&}
<span style="color: #&&&&//&创建属性Name
<span style="color: #&&&&public&string&Name
<span style="color: #&&&&{
<span style="color: #&&&&&&&&get&{&return&_N&}
<span style="color: #&&&&}
<span style="color: #&&&&//&创建属性Price
<span style="color: #&&&&public&decimal&Price
<span style="color: #&&&&{
<span style="color: #&&&&&&&&get&{&return&_P&}
<span style="color: #&&&&}
<span style="color: #&&&&//&创建属性Quantity
<span style="color: #&&&&public&int&Quantity
<span style="color: #&&&&{
<span style="color: #&&&&&&&&get&{&return&_Q&}
<span style="color: #&&&&&&&&set&{&_Quantity&=&&}
<span style="color: #&&&&}
<span style="color: #&&&&//&创建类构造函数
<span style="color: #&&&&public&CartItem(int&ID,&string&Name,&decimal&Price)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&_ID&=&ID;
<span style="color: #&&&&&&&&_Name&=&N
<span style="color: #&&&&&&&&_Price&=&P
<span style="color: #&&&&}
<span style="color: #}
&这个类需要我们了解非泛型集合哈希表的用法。
编译并运行后,点击登录按钮,按照提示进行登录操作,当然此时无法登录成功,因为我们还未配置用户名,然而经过此次不成功的登录并退出后,马上会发现在App_Data目录中ASP.NET 2.0已经为我们建立了一个名为ASPNETDB.mdf的数据库。那么我们此时可以建立"Tom"这个用户了,步骤如下:
1.单击"网站"菜单下的"ASPNET配置"子菜单,弹出如下界面:
点击"安全"-&"创建用户",并按照刚才未登录成功的提示用户和密码创建这个用户,其他信息自己随便填写。
创建好的用户现在有一个了,注意此时还未启用角色管理,如图:
双击ASPNETDB.MDF数据库,打开里面的ASPNET_USERS表,会发现现在多了一个刚注册的用户。
那么现在开始构建购物车相关代码,以上Default.aspx.cs中代码无需变动,只需将ProductGrid和CartGrid这两个GridView控件设置各自的OnSelectedIndexChanged事件分别指向AddCartItem和RemoveCartItem方法,用于分别加入购物车和从购物车删除功能。请看如下两个代码片段:
&& &asp:GridView ID="ProductGrid" runat="server" OnSelectedIndexChanged="AddCartItem"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& Width="300px" AllowPaging="True" AutoGenerateColumns="False" BackColor="White"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& BorderColor="#CC9966" BorderStyle="None" BorderWidth="1px" CellPadding="4" DataKe............
& &asp:GridView ID="CartGrid" AutoGenerateColumns="False" DataKeyNames="ID" OnSelectedIndexChanged="RemoveCartItem"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& CellPadding="4" Width="320px" runat="Server" BackColor="White" BorderColor="#CC9966"................
现在Default页面的后台代码如下:
Default.aspx.cs
&2using&System.D
&3using&System.C
&4using&System.W
&5using&System.Web.S
&6using&System.Web.UI;
&7using&System.Web.UI.WebC
&8using&System.Web.UI.WebControls.WebP
&9using&System.Web.UI.HtmlC
<span style="color: #
<span style="color: #public&partial&class&_Default&:&System.Web.UI.Page
<span style="color: #{
<span style="color: #&&&&protected&void&Page_Load(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&if&(!Page.IsPostBack)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&BindShoppingCart();
<span style="color: #&&&&&&&&}
<span style="color: #&&&&}
<span style="color: #&&&&//&显示Profile对象中保存的购物车信息
<span style="color: #&&&&protected&void&BindShoppingCart()
<span style="color: #&&&&{
<span style="color: #&&&&&&&&//如果Profile中存储的购物车的商品不为空,则进行数据绑定并计算总价
<span style="color: #&&&&&&&&if&(Profile.ShoppingCart&!=&null)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&CartGrid.DataSource&=&Profile.ShoppingCart.CartI
<span style="color: #&&&&&&&&&&&&CartGrid.DataBind();
<span style="color: #&&&&&&&&&&&&lblTotal.Text&=&"总价:"&+&Profile.ShoppingCart.Total.ToString("c");
<span style="color: #&&&&&&&&}
<span style="color: #&&&&}
<span style="color: #&&&&//&将选中商品添加到购物车中
<span style="color: #&&&&protected&void&AddCartItem(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&//&获取被选中数据行
<span style="color: #&&&&&&&&GridViewRow&row&=&ProductGrid.SelectedR
<span style="color: #&&&&&&&&//&获取主键ID的值
<span style="color: #&&&&&&&&int&ID&=&(int)ProductGrid.SelectedDataKey.V
<span style="color: #&&&&&&&&//&获取商品名称
<span style="color: #&&&&&&&&String&Name&=&row.Cells[<span style="color: #].T
<span style="color: #&&&&&&&&//&获取商品单价
<span style="color: #&&&&&&&&decimal&Price&=&Decimal.Parse(row.Cells[<span style="color: #].Text,&System.Globalization.NumberStyles.Currency);
<span style="color: #&&&&&&&&//&如果Profile中存储的购物车对象为null,则创建一个相应对象
<span style="color: #&&&&&&&&if&(Profile.ShoppingCart&==&null)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&Profile.ShoppingCart&=&new&ShoppingCart();
<span style="color: #&&&&&&&&}
<span style="color: #&&&&&&&&//&利用前面获取的数据,在Profile对象购物车中添加被选中的商品
<span style="color: #&&&&&&&&Profile.ShoppingCart.AddItem(ID,&Name,&Price);
<span style="color: #&&&&&&&&//&显示购物车数据
<span style="color: #&&&&&&&&BindShoppingCart();
<span style="color: #&&&&}
<span style="color: #&&&&//&将选中商品从购物车中删除
<span style="color: #&&&&protected&void&RemoveCartItem(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&//&获取被选中商品的主键ID
<span style="color: #&&&&&&&&int&ID&=&(int)CartGrid.SelectedDataKey.V
<span style="color: #&&&&&&&&//&利用ID,从Profile对象购物车中删除该商品
<span style="color: #&&&&&&&&Profile.ShoppingCart.RemoveItem(ID);
<span style="color: #&&&&&&&&//&显示购物车数据
<span style="color: #&&&&&&&&BindShoppingCart();
<span style="color: #&&&&}
<span style="color: #
<span style="color: #&&&&protected&void&Page_PreRender(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&if&(Profile.IsAnonymous)
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&lbUserName.Text&=&"匿名用户";
<span style="color: #&&&&&&&&&&&&lbtLogout.Visible&=&false;
<span style="color: #&&&&&&&&}
<span style="color: #&&&&&&&&else
<span style="color: #&&&&&&&&{
<span style="color: #&&&&&&&&&&&&lbUserName.Text&=&Profile.UserN
<span style="color: #&&&&&&&&&&&&lbtLogin.Visible&=&false;
<span style="color: #&&&&&&&&}
<span style="color: #&&&&}
<span style="color: #&&&&protected&void&lbtLogin_Click(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&Response.Redirect("Login.aspx");
<span style="color: #&&&&}
<span style="color: #&&&&protected&void&lbtLogout_Click(object&sender,&EventArgs&e)
<span style="color: #&&&&{
<span style="color: #&&&&&&&&FormsAuthentication.SignOut();
<span style="color: #&&&&}
<span style="color: #}
现在我们在Default.aspx.cs中可以使用profile这个类了,因为我们在Web.config中已经加入了Profile配置节的定义了。
再次编译运行,我们会发现可以开始在匿名身份下进行购物车的商品添加操作了,我们加入一个商品,并退出,待下次重新用匿名身份运行时,仍然能看到以前购物车里选择的商品。那么此时ASP.NET 2.0真正把匿名用户当一个状态用户来保存了,那么这些信息存在哪儿呢?答案就在ASPNETDB数据库的表aspnet_Profile表中,我们可以看到最近这个匿名用户登录的情况,并且在PropertyNames字段可以看到购物车信息。注意:此时ASP.NET 2.0为这个匿名用户生成了唯一的UserId,并且在ASPNET_Users表中此UserId也生成了另一条记录,这两个表通过这个字段关联的,可见,ASP.NET 2.0已经把这个匿名用户同刚才注册用户"Tom"都当作用户来管理了,但区别是两者在ASPNET_Users表中 IsAnonymous(是否是匿名用户)字段值是不同的。
再次运行网站,仍然看到匿名用户的购物信息,但此时点击"登录"按钮进入登录页面(Login.aspx),输入正确的用户名和密码,如果都正确,界面上Login控件所在的"提交"按钮会自动关联ASPNETDB数据库,进行登录验证,所以Login页面无需任何代码。那么此时当输入用户名密码都正确后,进入购物车页面,会发现,匿名用户变成了注册用户名,然而,刚才匿名购物的信息没有了,也就是此时购物车是空的。按理说,匿名用户登录成功后,应该把购物信息带入到注册用户中去,这就是所谓的匿名用户的迁移问题!但此时无法实现,其实还有最后一道代码编写任务,那就是:
&&&&&&&&&&&在网站下新建一个全局应用程序类---Global.asax,去掉所有代码并写入如下代码:
&&&&&&&&&&
Global.asax
&1&%@&Application&Language="C#"&%&
&3&script&RunAt="server"&
&5&&&&void&Profile_MigrateAnonymous(Object&sender,&ProfileMigrateEventArgs&pe)
&7&&&&&&&&//获取匿名用户的Profile对象
&8&&&&&&&&ProfileCommon&anonProfile&=&Profile.GetProfile(pe.AnonymousID);
&9&&&&&&&&//如果总价为不为0(说明匿名用户进行了选择),则将匿名用户的Profile存储起来
<span style="color: #&&&&&&&&if&(anonProfile.ShoppingCart.Total&&!=&<span style="color: #)
<span style="color: #&&&&&&&&{&&&&&&&&&&&&
<span style="color: #&&&&&&&&&&&&Profile.ShoppingCart&=&anonProfile.ShoppingC&&&&&&&&&&&&
<span style="color: #&&&&&&&&}&&&&&&&&
<span style="color: #&&&&&&&&//删除匿名用户的用户数据(从aspnet_Users表)
<span style="color: #&&&&&&&&Membership.DeleteUser(pe.AnonymousID);
<span style="color: #&&&&&&&&//删除匿名用户的Profle数据(从aspnet_Profile表)
<span style="color: #&&&&&&&&ProfileManager.DeleteProfile(pe.AnonymousID);
<span style="color: #&&&&&&&&//删除匿名用户标识
<span style="color: #&&&&&&&&AnonymousIdentificationModule.ClearAnonymousIdentifier();&&&&&&&&
<span style="color: #&&&&}
<span style="color: #&/script&
<span style="color: #
加入上述代码后,,再次运行并登录成功,会发现匿名用户的购物信息已经迁移到注册用户这边来了,那么我们的目的也达到了。下面是对上述代码的详细解释:
Profile_MigrateAnonymous事件:
&&&&&当用户以匿名身份选择商品,并通过登录站点成为注册用户过程中,会引发一个重要的事件MigrateAnonymous,该事件的处理程序是Profile_MigrateAnonymous。&
ProfileCommon 类解释:
在运行时,ASP.NET 编译系统使用 profile 节中指定的信息生成一个名为 ProfileCommon 的类,该类派生自 。ProfileCommon 类定义基于配置文件的 profile 节中定义的属性。该类允许你访问并修改各个配置文件的值。为每个用户配置文件创建一个此类的实例,并且您可以通过
属性以代码访问各个配置文件值。有关 ASP.NET 2.0 中新增的配置文件功能的更多信息,请参见 。
小结:经过上述步骤,可以将一个未使用任何用户管理的网站利用ASP.NET 2.0内置的功能配置成用户管理模式。关键是理解Profile配置节的功能以及匿名用户迁移代码的写法。
问题思考:那么上述自动生成的数据库是否能在SQL Server2005中找到呢?现在还只是实现了用户的管理,那么权限管理怎么做?这些问题将在下篇中介绍。
阅读(...) 评论()

我要回帖

更多关于 匿名邮箱注册 的文章

 

随机推荐