Profile 详解之 Provider 和 基本用法

2010-03-02 13:14 by ╭☆涩 轨ら, 159 visits, 网摘, 收藏, 编辑

正如前面介绍 Membership 和 Role 的顺序,

这里呢,我先介绍一下 Profile 的 Provider,

Profile 其默认的 Provider 是 AspNetSqlProfileProvider ,

不过您也可以在配置文件 web.config 中自定义 Provider ,

并且其中也还有很多属性可以设置,

具体的请看注解(当然我列出的只是比较常用的属性而已)

Profile 详解之 Provider 和 基本用法_第1张图片

在这里定义好了属性后,便会自动生成两个动态类 --- Profile 和 ProfileCommon

这两个类呢是当您在 web.config 中定义了 profile 节后自动生成的,

并且是继承自 ProfileBase 类,由于这两个类是动态生成的,

而非 .NET Framework 和 自定义所有,所以在 MSDN 中您都是查找不到这两个类的信息的,

定义好 web.config 后,

Profile 和 ProfileCommon 两个类便可以在服务器端代码中使用了,

但是这里,我遇到一个问题,

就是在 VS 2008 中的 Code-Behind 中无法使用这些属性,

但是在页面中嵌入服务器代码的方式却是可以使用的

而在 VS 2005 中,两种方式都可以使用,

(要看这个问题的具体描述可以看上上篇博文,但是现在还没有得到解决办法,

    等问题解决后,一定及时公布)

由于存在上面的这个问题,所以我在完成有关 Profile 的 Demo 时,

都是使用将服务器端代码直接嵌入在 .aspx 页面中,

而不是使用 Code-Behind 的这种方式来完成的,

不过这个并不会影响 Demo 的质量和内容,在这里只是提醒一下,

当然咯,在 Code-Behind 里面不能访问的

只有上面的自动生成的 Profile 和 ProfileCommon 两个类而已,

而像 ProfileBase , ProfileProvider , ProfileModule (这三个类很重要,以后会介绍)

这些类都是可以在 Code-Behind 中使用的,

下面就来看一个使用 Profile 的 Demo 吧,

首先,要使用 Profile ,必须先设置 web.config 文件,

最简单的设置方式是:(很多属性都使用默认的就 OK 了)

Profile 详解之 Provider 和 基本用法_第2张图片

定义好了 Profile 节后,

便可以直接在服务器代码中使用自动生成的 Profile 和 ProfileCommon 类了,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

等下大家看后面的 Demo 的服务器端代码就一目了然了,

还有必须提醒一点的是,Profile 用户文件设置到底是用来做什么的,

大家必须有一个彻底的了解,先从 Membership 讲起吧,

在注册为 Membership 用户时,大家都知道,

只有用户名,密码,邮箱,密码安全问题和解答这些最最基本的用户的信息,

但是对于一个网站的用户来说,这些信息是根本不够的,比如,用户的兴趣爱好啊,

用户擅长的技术啊,用户的昵称啊,用户的个性签名啊,

这些等等都必须通过另外的机制来实现,

这就是 Profile 的功效了,可以说 Profile 是 Membership 的一个补充,

还有的是用 Profile 来定义每个用户的个性网页,

比如用户喜欢的背景色和前景色这些都可以成为用户个性化文件,

上面的就是解释了 Profile 用户个性化设置到底是个啥作用了,

接下来就要看一个 Demo 来演示如何在 web.config 中定义好属性,

然后使用服务器代码访问这些属性,并且将用户添加的个性化属性保存发到数据库中,

Demo 是采用将 C# 代码嵌入在 .aspx 中,

(前面已经解释了我为什么没有使用 Code-Behind 的原因)

我的 web.config 呢就定义成和上面截图一样,定义了住址,电话群,星座三个属性,

<%@ Page Language="C#" AutoEventWireup="true"%>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!User.Identity.IsAuthenticated)
        {
            FormsAuthentication.RedirectToLoginPage();           
        }

    }

    protected void btnSavaProfile_Click(object sender, EventArgs e)
    {
        if (User == null)
        {
            lblMsg.Text = "您为不合法用户!!!";
            return;
        }
        if (!String.IsNullOrEmpty(txtAddress.Text))
        {
            Profile.住址 = txtAddress.Text;
        }
        if (!String.IsNullOrEmpty(txtPhone.Text))
        {
            if (rBtnListPhone.SelectedItem.Text == "家庭电话")
            {
                Profile.电话.家庭电话 = txtPhone.Text;
            }
            else
            {
               Profile.电话.移动电话 = txtPhone.Text;
            }
        }
        if (!String.IsNullOrEmpty(txtConstellate.Text))
        {
            Profile.星座 = txtConstellate.Text;
        }       

        Profile.Save();
        lblMsg.Text = "恭喜您,保存 Profile 成功!!!";
        txtAddress.Text = "";
        txtConstellate.Text = "";
        txtPhone.Text = "";

    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        .style1
        {
            width: 31%;
            height: 205px;
        }
        .style2
        {
            height: 36px;
            font-size: small;
        }
        .style3
        {
            height: 46px;
            text-align: center;
        }
        .style4
        {
            height: 23px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <div style="font-family: 微软雅黑; font-size: small">
        <table class="style1" style="border-color: #8000FF">
            <tr>
                <td>
                    住址
                </td>
                <td>
                    <asp:TextBox ID="txtAddress" runat="server">
                    </asp:TextBox>
                </td>
            </tr>
            <tr>
                <td>
                    <asp:RadioButtonList ID="rBtnListPhone"
                    runat="server" Height="49px" Width="112px">
                        <asp:ListItem Selected="True">家庭电话
                        </asp:ListItem>
                        <asp:ListItem>移动电话</asp:ListItem>
                    </asp:RadioButtonList>
                </td>
                <td>
                    <asp:TextBox ID="txtPhone" runat="server">
                    </asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style2">
                    星座
                </td>
                <td class="style2">
                    <asp:TextBox ID="txtConstellate" runat="server">
                    </asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style3" colspan="2">
                    <asp:Label ID="lblMsg" runat="server"
                     Style="color: #FF0066">
                    </asp:Label>
                </td>
            </tr>
            <tr>
                <td class="style4" style="text-align: right">
                    <asp:Button ID="btnSavaProfile" runat="server"
                    OnClick="btnSavaProfile_Click" Text="保存 Profile" />
                </td>
            </tr>
        </table>
        <br />
        <br />
    </div>
    </form>
</body>
</html>

上面的 Demo 还有一点需要提醒一下,

就是由于 Profile 可以说是 Membership 的一个补充,

所以,Profile 用户个性化设置肯定也是针对用户而言的,

所谓个性化就是每一个都可以根据自己的喜好进行设置,

所以每一个用户都有自己的 Profile ,

既然如此,那肯定在保存 Profile 个性化设置到数据库时,

也肯定是根据用户来进行保存的

(在这里我先不考虑 Profile 的匿名机制,事实上,

   匿名机制也是产生了唯一的辨别用户的 GUID 标识)

既然是根据用户保存的,那么肯定也需要先登录一个用户啊,

只有登录了用户,取得了登录的用户的用户名,这样才能够进行保存,

其 Profile.Sava()可以自动获取当前的用户名进行保存 Profile .

还有就是上面的 Profile 这个静态类呢,是动态生成的,其继承自 ProfileBase 类。

下面就来看下效果吧,

因为要确定用户,所以会先跳转到登陆页面进行登陆操作,

我以 XiaoZhen 登录吧

Profile 详解之 Provider 和 基本用法_第3张图片

Profile 详解之 Provider 和 基本用法_第4张图片

Profile 详解之 Provider 和 基本用法_第5张图片

给 XiaoZhen 这个用户保存了 Profile 之后呢,

就来看数据库 aspnet_profile 了

Profile 详解之 Provider 和 基本用法_第6张图片

再看下面的截图就可以清楚的看到刚才上面保存的 Profile 的结果了

Profile 详解之 Provider 和 基本用法_第7张图片

在这里,我再来解释一下 Profile 在数据库中保存的格式,

其实呢,一开始,我想很多人都会想到应该是会在数据库中扩充字段,

也就是当用户要加入住址时,便在数据库中扩充一个字段 Address ,

其实呢,微软并不是这样处理的,

不过,其实再想想也是可以明白上面那种扩充字段的方式显然是不合适的,

你想啊,我一添加一个属性就添加一个字段,那个数据库的架构被搞的还行啊,

以后还谈什么架构,谈什么模式啊,全部都乱了,而且如果您一添加属性就要添加字段,

我想,这样数据库的效率也高不到那里去,

微软采用的呢,

其实是将 Profile 的属性名存储在 aspnet_profile 中的 PropertyNames 属性中,

而其属性相关的值则是存储在 aspnet_profile 中的 PropertyValuesString 中,

并且在 PropertyNames 中还一并存储了

每一个属性在 PropertyValuesString 中的起始字符位置和长度。

比如上面的

Profile 详解之 Provider 和 基本用法_第8张图片

就表示住址这个属性的值在这一行对应得 PropertyValuesStrin 中的第 1 个字符起,

而长度是 4 ,字符数为 4,也就是对应的

Profile 详解之 Provider 和 基本用法_第9张图片

这一篇博文呢,主要是讲了一下 Profile 的 web.config 中的 profile 节,

同时还演示了 Profile 的最基本的用法及其在数据库中的存储方式等等的基本内容。

你可能感兴趣的:(数据库,server,服务器,asp,textbox,电话)