BK

我是BK,不断成长,不愿辜负任何对我保有期盼的人...
posts - 30, comments - 85, trackbacks - 1, articles - 2
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2007年10月12日

  • 让保姆,爷爷奶奶带孩子。不自己亲自照顾
      很多中国父母以为孩子只要身边有人看著,没有生命危险就好。其实从出生开始,孩子就需要和别人交流。不会说话也可以交流。肌肤的接触,拥抱,关注的眼光,和他说话。 
      孩子需要不断的交流,会变得比较聪明,对爱有安全感。我们很多家庭的孩子,是在没有关注的环境下长大。脑子会变得怪异呆滞。然后永远缺乏爱的安全感。终生追求那童年,婴儿时期失去却永远追不回的爱。
      另外最要命的事,保姆、爷爷奶奶与孩子没有切身厉害关系,他们只会把他照顾好,满足他的衣食需求,也不会去管到底自己有没有做对(可能他们也不知道什么样的教育方式才叫做对,甚至许多年轻父母自己也不知道),因此他们不懂得什么是爱,于是把爱就变成了伤害,并且是最严重的伤害!!
      譬如说个例子:当孩子摔倒后,奶奶会赶紧抱起孩子,爷爷会骂她,还会用拐杖去敲,“都怪你,摔了我宝贝!”看到了没,这样的教育,培养的是小孩的一种推卸意识:什么都是别人的错!.............不从自己身上找原因,从别的一切:别人、地方、气候.....只要能想到的都可以。
  • 把孩子当炫耀比较的对象
      中国人一方面爱面子,一方面想鼓励孩子上进。常常说,你看人家孩子多用功,成绩多好。人家又得了什么奖。这种比较最要不得。况且常常是当著很多人的面说。说难听点,孩子考试考不好只怪你基因太差。人受到基因影响太多了。包括智力,个性种种。并不是孩子不愿意做好。实在是你的基因问题太多。你每一次把孩子和别人比,只带给他多一份不满和痛苦。对于事情没有什么帮助。
      这种比较和竞争的心里,也导致中国人团体比较无法和谐合作做事。喜欢互斗。对于能力强的人不是佩服,而是嫉妒,要拉他下来。学校的老师更是火上加油。整个家长和老师的教育观念需要加速修正。否则中国人的团队合作永远不如人。
      要知道,孩子不是你的财产,也不是你的资本。他是你的生命的延续,因此,你要对他负起责任来!孩子不可以被用来充面子,那样只会有一个结果:伤害了孩子,从心理上!
      比如说父母带小孩子去超市逛,小孩子看到喜爱的玩具会不走,甚至当父母不给买的时候会大哭,这时候呢,父母会觉得很没面子:“小祖宗,不要哭了,给你买还不行吗!?”看看产生了什么结果:孩子明白了意见事情,那就是只要哭,就可以得到想要的一切,不管对不对。根源在哪里?对了,父母的面子,怕孩子哭丢自己的面子,于是没有了原则。为什么不这样的,问问他:“宝宝,为什么要这个玩具呢?”如果是合理的,去赞扬他再给他买,如果是不合理的,告诉他为什么,仅仅需要这样就可以了。
  • 不尊重孩子的隐私和权利
      很多父母抱著传统的观念,把父母摆在权威的角色。认为子女是属于父母的。这种不把孩子当一个拥有完整权利个体的错误观念,导致个人和社会的很多不良的后果。父母进入子女房间应该先敲门。移动或用孩子的东西应该得到他的允许。任何牵涉到子女的决定应该先和子女商谈。不要随意翻看子女的日记或隐私。应该尊重孩子的所有权利,把他当一个成人一样尊重。这个尊重是从出生换尿片开始。换尿片前,先和颜悦色告诉他要换尿片了,向他道歉,请他忍耐一下。
      这种尊重的精神是我们社会所缺乏的。导致社会缺乏服务和尊重的观念。不被尊重的人以后也不知道尊重别人。
  • 把孩子塑造成自己想要的方向
      很多父母把自己一生的遗憾寄托在孩子身上。一直逼孩子往自己以为是正确的路走。即使孩子并不适合,或者不喜欢。譬如学钢琴。譬如出国。在这种压力下,家庭变的不快乐。亲子的愉快时光成了斗争大会。牺牲了亲子的和谐关系,追求一些莫明其妙,也不见得正确的父母理想。当子女长大回想起童年,尽是不快乐的回忆。的确是些愚蠢父母的作为。
      要知道,孩子的肩膀是稚嫩的,怎么可以承担的起你的千斤重托?父母需要做的只是这样的事情:教给他什么是对,什么是错,让他身心健康的成长,培养他健全的人格。此外还需要做什么呢?还有关心他,支持他!别的,你相信他不会做吗?
  • 把学校成绩当成一切表现的指标。认为越用功越好。一切面向高考,面向出国。
      很多父母愚蠢地以为学校的成绩代表一切。人生的目标两个,一是高考,二是留学。目标订清楚了。父母剩下的工作,就是用一切威逼利诱苦苦哀求,来达到这个目的。这个科举时代遗留的过时观念,仍旧深存人心。
      其实事实摆在面前。很多出国回来现在找不到工作。很多北大清华的现在也只能混口饭吃。在学校的成绩并不代表一切。反而是全面的能力,活力,毅力,性格,才是影响他们一生的重要因素。
      网上最近热炒这么一句话:考上大学了,获得给人打工的机会了;没有考上大学,可以做老板了........
  • 认为早起很好,睡觉就是懒惰
      成长中孩子需要充分的睡眠。目前全国教育界正在集体犯罪,剥夺孩子们的睡眠时间。毁灭中华民族的健康下一代。很多孩子6点就起床。每天睡不足8小时。全国还在推广早起才健康的错误观念。睡不足会影响发育。脑力会减退。我们的孩子需要充分的睡眠。
      全国违法让孩子在周末学习或晚睡觉的教育人士应该用严厉的法律措施来禁止。剥夺中国孩子的玩耍放松睡觉的时间,是全国性的集体犯罪。应该逮捕这些犯罪的教育人士。
      为什么会这样子呢?对了,学习成绩,学习成绩第一,超过了孩子的身心健康,人格完善,超过了他实际需要的一切!想一想,一定要这样吗?为什么要这样呢?
  • 认为孩子不应该做家事,应该把时间拿来学习
      社会学家调查的结果,在家常做家事的孩子将来生活比较幸福。可能是因为处理事情的能力比较强。所以长大以后比较不容易有挫折。或者比较能面对挫折。中国的父母为了让孩子学习,剥夺了一切孩子做家事的机会。剥夺了他学习工作,学习分担责任,学习面对问题的机会。教养出一个个只会解几题数学(又解不好、的傻孩子)。中国父母应该让子女充分分担家事。学校应该全面减低作业份量。
      培养孩子为什么,考中学,考大学,考研究生,出国......还有吗?这些都不是,培养他身心健康,明白事理,做一个对社会有用的人就足够了,没有必要去为了学习而学习,为了考学而考学......难道发生在自己身上的事情还要继续发生下去吗?
  • 缺乏幽默感和轻松的一面
      或许因为各种压力,家庭的基本气氛就是逼孩子学习。什么是家庭生活?什么是亲子活动?完全不知道。父母因为生活压力,失去了幽默感,失去了轻松。一切都是逼,都是赶,都是高考。实在不知道人活著是为什么。亲子或夫妻在这种缺乏轻松和幽默感的气氛下,一个小挫折就会引爆冲突。
  • 认为父母的爱可以是对子女任何不合理要求的借口
      男女之间,爱并不是为一切所欲为的借口。或许因为电视剧演太多了。很多人以为爱就可以当一切的借口。很多父母常对子女说的一句话:我们这样做,也是因为爱你,为你好啊。想用这句话堵住子女的反驳。这简直荒谬。要求不合理就是不合理。别把爱扯进来当挡箭牌。父母的要求应该要合理。让孩子心服口服。
  • 认为养孩子是坚苦的义务,不是享受
      中国父母,经过传统的教育,习惯把养育儿女当成艰苦的义务。也因为这个苦,而常常暗示或明示子女要回报,孝顺。比较正确的态度是养孩子是一种上天赐予的享受。应该享受和子女相处的时光。享受看著他成长的乐趣。
  • posted @ 2007-10-12 17:37 blue1000 阅读(171) 评论(0) 编辑

    2007年10月8日

    尊重作者,请保留 www.it55.com 链接字样。

    网上有类似的教程,但是是asp.net 1.1的版本,这是本人写的,asp.net 2.0支持。


            public string GetIPByDomain(string url)
            {
                if (url.Trim() == string.Empty)
                    return "";
                try
                {
                    System.Net.IPHostEntry host = System.Net.Dns.GetHostEntry(url);
                    return host.AddressList.GetValue(0).ToString();
                }
                catch (Exception e)
                { 
                    throw e;
                }
           }

    调用方法: GetIPByDomain("www.it55.com")

    posted @ 2007-10-08 15:11 blue1000 阅读(531) 评论(6) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    登录系列控件支持可视化操作,只需要修改相应的属性设置就能满足基本功能,在代码层不需要添加任何代码,当在页面中拖入一个登录系列控件后,.NET会自动在项目的数据库文件夹中增加1个数据库,用于登录控件的数据访问。

    但是,个人认为Asp.Net 2.0 的登陆控件,甚至包括成员资格、角色管理等,在实际开发过程中实用性都不敢恭维,还是需要我们编写自己的用户登录及角色程序。所以这里就不多讲了,转来网友的一篇简介给我们的.Net2.0学习来个结尾。

    众多 ASP.NET 登录控件一起为无需编程的 ASP.NET Web 应用程序提供可靠完整的登录解决方案。默认情况下,登录控件与 ASP.NET 成员资格集成,以帮助使网站的用户身份验证过程自动化。有关 ASP.NET 成员资格的信息,请参见成员资格介绍。

    默认情况下,ASP.NET 登录控件以纯文本形式工作于 HTTP 上。如果您对安全性十分关注,那么可以使用带 SSL 加密的 HTTPS。

    本主题描述每个控件并提供指向其参考文档的链接。

    Login 控件

    Login 控件显示用于执行用户身份验证的用户界面。Login 控件包含用于用户名和密码的文本框和一个复选框,该复选框让用户指示是否需要服务器使用 ASP.NET 成员资格存储他们的标识并且当他们下次访问该站点时自动进行身份验证。

    Login 控件有用于自定义显示、自定义消息的属性和指向其他页的链接,在那些页面中用户可以更改密码或找回忘记的密码。Login 控件可用作主页上的独立控件,或者您还可以在专门的登录页上使用它。

    如果您一同使用 Login 控件和 ASP.NET 成员资格,将不需要编写执行身份验证的代码。然而,如果您想创建自己的身份验证逻辑,则您可以处理 Login 控件的 Authenticate 事件并添加自定义身份验证代码。

    LoginView 控件

    使用 LoginView 控件,可以向匿名用户和登录用户显示不同的信息。该控件显示以下两个模板之一:AnonymousTemplate 或 LoggedInTemplate。在这些模板中,您可以分别添加为匿名用户和经过身份验证的用户显示适当信息的标记和控件。

    LoginView 控件还包括 ViewChanging 和 ViewChanged 的事件,您可以为这些事件编写当用户登录或更改状态时的处理程序。

    LoginStatus 控件

    LoginStatus 控件为没有通过身份验证的用户显示登录链接,为通过身份验证的用户显示注销链接。登录链接将用户带到登录页。注销链接将当前用户的身份重置为匿名用户。

    可以通过设置 LoginText 和 LoginImageUrl 属性自定义 LoginStatus 控件的外观。

    LoginName 控件

    如果用户已使用 ASP.NET 成员资格登录,LoginName 控件将显示该用户的登录名。或者,如果站点使用集成 Windows 身份验证,该控件将显示用户的 Windows 帐户名。

    PasswordRecovery 控件

    PasswordRecovery 控件允许根据创建帐户时所使用的电子邮件地址来找回用户密码。PasswordRecovery 控件会向用户发送包含密码的电子邮件。

    您可以配置 ASP.NET 成员资格,以使用不可逆的加密来存储密码。在这种情况下,PasswordRecovery 控件将生成一个新密码,而不是将原始密码发送给用户。

    您还可以配置成员资格,以包括一个用户为了找回密码必须回答的安全提示问题。如果这样做,PasswordRecovery 控件将在找回密码前提问该问题并核对答案。

    PasswordRecovery 控件要求您的应用程序能够将电子邮件转发给简单邮件传输协议 (SMTP) 服务器。您可以通过设置 MailDefinition 属性自定义发送给用户的电子邮件的文本和格式。

    注意
    电子邮件中的密码信息是以明文形式发送的。
     

    下面的示例演示了一个在 ASP.NET 页中声明的 PasswordRecovery 控件,其 MailDefinition 属性设置用来自定义电子邮件。

    <asp:PasswordRecovery ID="PasswordRecovery1" Runat="server"
        SubmitButtonText="Get Password" SubmitButtonType="Link">
      <MailDefinition From="administrator@Contoso.com"
        Subject="Your new password"
        BodyFileName="PasswordMail.txt" />
    </asp:PasswordRecovery>

    CreateUserWizard 控件

    CreateUserWizard 控件收集潜在用户提供的信息。默认情况下,CreateUserWizard 控件将新用户添加到 ASP.NET 成员资格系统中。

    CreateUserWizard 控件收集下列用户信息:

    用户名

    密码

    密码确认

    电子邮件地址

    安全提示问题

    安全答案

    此信息用来对用户进行身份验证并找回用户密码(如果需要的话)。

    注意
    CreateUserWizard 控件从 Wizard 控件继承。
     

    下面的示例演示了 CreateUserWizard 控件的一个典型 ASP.NET 声明:

    <asp:CreateUserWizard ID="CreateUserWizard1" Runat="server"
        ContinueDestinationPageUrl="~/Default.aspx">
      <WizardSteps>
        <asp:CreateUserWizardStep Runat="server"
          Title="Sign Up for Your New Account">
        </asp:CreateUserWizardStep>
        <asp:CompleteWizardStep Runat="server"
          Title="Complete">
        </asp:CompleteWizardStep>
      </WizardSteps>
    </asp:CreateUserWizard>

    ChangePassword 控件

    通过 ChangePassword 控件,用户可以更改其密码。用户必须首先提供原始密码,然后创建并确认新密码。如果原始密码正确,则用户密码将更改为新密码。该控件还支持发送关于新密码的电子邮件。#p#分页标题#e#

    ChangePassword 控件包含显示给用户的两个模板化视图。第一个模板是 ChangePasswordTemplate,它显示用来收集更改用户密码所需的数据的用户界面。第二个模板是 SuccessTemplate,它定义当用户密码更改成功以后显示的用户界面。

    ChangePassword 控件由通过身份验证和未通过身份验证的用户使用。如果用户未通过身份验证,该控件将提示用户输入登录名。如果用户已通过身份验证,该控件将用用户的登录名填充文本框。

    posted @ 2007-10-08 14:49 blue1000 阅读(2511) 评论(2) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    每一个完善的网站管理系统都应该包括用户管理、角色管理,都包含用户注册、密码修改、用户登录、身份验证等功能。在asp.net 1.x时代,程序员为了这些常用的功能反复做着重复性的工作,今天的asp.net 2.0替我们封装了这些常用控件及机制,给我们带来了诸多便利。接下来两节我们就来学习这方面的内容。
    这一节我们讲述asp.net 2.0的成员资格和角色管理部分。


    1、asp.net的身份验证方式
    asp.net的身份验证方式有4种:Windows验证、Passport验证、None验证、Forms验证。在我们的Web应用程序开发中,Forms验证方式是最常用的,所以这里我们只涉及Forms验证。
    asp.net 2.0网站的身份验证信息除了可以像常规程序那样保存在Cookie中之外,还提供了一种Url保存会话的方案,即“无Cookie会话功能”。“无Cookie会话功能”是为了避免客户端因为屏蔽了Cookie功能而无法进行身份验证的情况而设计的,但是这个功能同时也带来了安全隐患,所以仍然建议使用Cookie会话方案。
    基于Forms的身份验证时,需要设置Web.config网站配置文件,设置<system.web>元素下的<authentication> 元素的 <forms> 子元素:

        <authentication mode="Forms">
          <forms name=".VS2005_Form" loginUrl="~/Security/Login.aspx" defaultUrl="~/Default.aspx"
               protection="All" timeout="30" path="/" requireSSL="false"
               slidingExpiration="true" enableCrossAppRedirects="false"
               cookieless="UseDeviceProfile">
          </forms>
        </authentication>

    <forms>元素的属性说明如下
    1) cookieless - 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。有效值如下:
       ·UseDeviceProfile - 默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。
       ·AutoDetect - 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。
       ·UseUri - 强制实施无 Cookie 票证
       ·UseCookies - 强制实施有 Cookie 票证。
    2) defaultUrl - 指定在成功登录后,请求将重定向到的默认 URL。
    3) domain - 指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“cnblogs.com”,则 webabcd.cnblogs.com 和 dudu.cnblogs.com可以共享一个 Cookie)。
    4) enableCrossAppRedirects - Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。
    5) loginUrl - 指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。
    6) name - 用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。
    7) path - 用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。)
    8) protection - 用于保护 Cookie 数据的方法。有效值如下:
       ·All - 同时使用数据验证和加密来保护 Cookie。所配置的数据验证算法是基于 <machinekey> 元素的。如果密钥足够长(48 个字符),默认情况下将使用 AES 进行加密。All 是默认(和建议)值。
       ·None - 用于仅将 Cookie 用于个性化设置并且安全性要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用 Cookie 需谨慎,但对于使用 .NET Framework 实现个性化设置的任何方法,此设置提供了最佳性能。
       ·Encryption - 使用 AES、TripleDES 或 DES 加密 Cookie,但不对 Cookie 进行数据验证。这类 Cookie 容易受到精心选择的纯文本的攻击。
       ·Validation - 不加密 Cookie 的内容,但验证 Cookie 数据在传输过程中是否未被更改。若要创建 Cookie,验证密钥在缓冲区中与 Cookie 数据连接,并且计算出 MAC 并将其追加到输出的 Cookie。
    9) requireSSL - 如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。
    10) slidingExpiration - 如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。
    11) timeout - 时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。) #p#分页标题#e#

    2、用户授权。
    在asp.net 2.0程序中,我们可以通过对Web.config文件进行配置,从而达到对访问权限的控制,配置方法如下:

    <authorization>
        <allow VERB="POST" users="2abcd@gmail.com" />
        <allow roles="admin" />
        <deny users="*" />
        <allow VERB="GET" users="abc,xyz" />
        <deny users="?" />
    </authorization>

    注:可以把授权用户和角色设置的配置写在某个文件夹内,则所做的配置只作用于该文件夹内,自动继承外面的配置。
    allow - 允许
    deny - 拒绝
    users - 用户(多用户用逗号隔开)
    roles - 角色(多角色用逗号隔开)
    verb - 指定http方法,post或get
    * - 所有用户
    ? - 匿名(未经过身份验证的)用户

    我们还可以按路径对角色授权:

        <location path="folder">
            <system.web>
                <authorization>
                    <deny users="?"/>
                    <allow users="*"/>
                </authorization>
            </system.web>
        </location>
       
        <location path="abc.aspx">
            <system.web>
                <authorization>
                    <allow roles="Administrators" />
                    <deny users="*"/>
                </authorization>
            </system.web>
        </location>

    <location>元素的path属性可以是文件夹也可以是某一文件

    3、成员资格管理
    Membership类和MembershipUser类是成员资格管理API中的重要成员。利用它们,我们能够实现用户的验证、管理、信息检索等功能。但在使用它们之前,我们需要修改Web.config来对其进行配置。配置示例:

        <membership defaultProvider="SqlMembershipProvider">
          <providers>
            <clear/>
            <add name="SqlMembershipProvider"
                  type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                  connectionStringName="SqlConnectionString"
                  enablePasswordRetrieval="false"
                  enablePasswordReset="true"
                  requiresQuestionAndAnswer="false"
                  applicationName="/"
                  requiresUniqueEmail="false"
                  passwordFormat="Hashed"
                  maxInvalidPasswordAttempts="3"
                  minRequiredPasswordLength="3"
                  minRequiredNonalphanumericCharacters="0"
                  passwordAttemptWindow="10"
                  passwordAnswerAttemptLockoutDuration="15"
                  passwordStrengthRegularExpression="" />
          </providers>
        </membership>

    enablePasswordRetrieval - 是否可以检索用户密码(总是false)
    enablePasswordReset - 是否允许用户重置其密码
    requiresQuestionAndAnswer - 是否要求在创建用户时提供密码提示问题和答案#p#分页标题#e#
    applicationName - 自定义成员资格提供程序的应用程序的名称
    requiresUniqueEmail - 电子邮件地址是否必须是唯一的
    passwordFormat - 存储的密码的格式
    maxInvalidPasswordAttempts - 用户回答密码重置问题时允许失败的次数
    minRequiredPasswordLength - 密码所要求的最小长度
    minRequiredNonalphanumericCharacters - 有效密码中必须包含的最少特殊字符数
    passwordAttemptWindow - 连续未能正确回答密码重置问题的次数进行跟踪的时间长度(单位:分钟)
    passwordAnswerAttemptLockoutDuration - 用户多次未能正确回答密码提示问题后用户帐户的锁定时间长度(单位:分钟)
    passwordStrengthRegularExpression - 用于验证密码的正则表达式

    Membership类部分功能实现代码示例:
     创建新用户:

      try{
             Membership.CreateUser ("name", "password", "mail");
           }
      catch (MembershipCreateUserException e)
           {
           // 失败
           switch (e.StatusCode)
              {
           case MembershipCreateStatus.DuplicateUsername:
              ……;
           case MembershipCreateStatus.DuplicateEmail:
              ……;
           case MembershipCreateStatus.InvalidPassword:
              ……;
           default:
              ……;
              }
           }

    登录验证:

     if (Membership.ValidateUser (UserName.Text, Password.Text))
         FormsAuthentication.RedirectFromLoginPage (UserName.Text, RememberMe.Checked);

    可以使用的方法:CreateUser(创建用户)  DeleteUser(删除用户)  GeneratePassword(生产随即密码)  GetAllUsers(得到用户)  GetUser(查看某个用户) UpdateUser(修改用户)  ValidateUser(验证是否成功)

    MembershipUser类部分功能实现代码示例:
     挂起登录权限:

     if (Membership.ValidateUser (UserName.Text, Password.Text)) {
        MembershipUser user = Membership.GetUser (UserName.Text);
        user.Comment = "0"; //记录登录次数
        RedirectFromLoginPage (UserName.Text, RememberMe.Checked);
        }
        else {
        MembershipUser user = Membership.GetUser (UserName.Text);
        if (user != null) {
            string count = Convert.ToInt32 (user.Comment) + 1;
             user.Comment = count.ToString ();
        }
    }

    它的一些方法和属性:
    属性:Comment  CreationDate  Email  LastLoginDate  LastPasswordChangedDate  UserId  UserName
    方法:  ChangePassword  ChangePassword-QuestionAndAnswer   GetPassword   ResetPassword

    4、角色管理
    若要实现角色管理,必须首先对Web.config文件中的<roleManager>配置节进行配置:

        <roleManager defaultProvider="SqlRoleProvider"
           enabled="true"
           cacheRolesInCookie="true"
           cookieName=".VS2005_Role"
           cookieTimeout="30"
           cookiePath="/"
           cookieRequireSSL="false"
           cookieSlidingExpiration="true"
           cookieProtection="All">
          <providers>
            <add
              name="SqlRoleProvider"
               type="System.Web.Security.SqlRoleProvider"
               connectionStringName="SqlConnectionString"
               applicationName="/" />
          </providers>
        </roleManager>

    cacheRolesInCookie :指定当验证某个用户是否在特定角色中时,先检查 Cookie,然后使用角色提供程序在数据源中检查角色列表。如果为 true,则缓存当前用户的 Cookie 中的角色名称列表;否则为 false。 默认值为 false。 #p#分页标题#e#
    cookieName:指定存储角色名称的 Cookie 的名称。默认值为 ".ASPXROLES"。
    cookiePath :角色名称 Cookie 的路径。 默认值为 "/"。
    cookieProtection:指定 CookieProtection 枚举值之一。默认值为 All 值。
    cookieRequireSSL:指定角色名称 Cookie 是否需要使用 SSL 来发送到服务器。如果设置为 true,则角色名称 Cookie 需要使用 SSL 来发送到服务器。 默认值为 false。
    cookieSlidingExpiration:指定是否将定期重置角色名称 Cookie 的过期日期和时间。如果设置为 true,则 Cookie 的过期日期和时间最初将设置为当前日期和时间与 CookieTimeout 值(分钟)的加和。当用户继续主动地使用 ASP.NET 应用程序时,Cookie 的过期日期和时间将在剩余时间不足 CookieTimeout 值的一半时自动更新。有关更多信息,请参见 Expires。默认值为 true。
    cookieTimeout:角色名称 Cookie 过期之前的时间(分钟)。默认值为 "30"(分钟)。
    createPersistentCookie:指定角色名称 Cookie 是否为会话 Cookie;即,该 Cookie 会在浏览器关闭时丢失。如果设置为 true,则角色名称 Cookie 是可跨多个浏览器会话使用的持久性 Cookie。持久性 Cookie 的过期日期和时间设置为当前的日期和时间与 CookieTimeout 值(分钟)的加和。默认值为 false。
    defaultProvider:默认角色提供程序的名称。有关更多信息,请参见 Provider。默认值为 "AspNetSqlRoleProvider"。
    domain:指定角色名称 Cookie 的 Domain 值。默认值为 HttpCookie 属性默认值,该值为空字符串 ("")。
    enabled:指定是否要启用角色管理。如果设置为 true,则启用角色管理。在 Machine.config 文件中,默认值为 false。
    maxCachedResults:指定缓存在角色 Cookie 中的角色名称的最大数目。默认值为 25。
     
    角色管理的API包括很多类,例如:Roles、RolePrincipal、RoleManagerEventArgs、RoleManagerModule等,其中Roles类是最重要的也是最常用的。
    Roles类常用的方法:AddUserToRole  CreateRole  DeleteRole   GetRolesForUser(查看用户角色)   GetUsersInRole   IsUserInRole  RemoveUserFromRole

    因为本节相关属性、方法、事件众多,所以这里只能尽可能地把常用的东东摆出来,如果有不明白的地方请自行搜索,google一下。

    成员资格源代码:
    upload/2007_05/07051722446157.rar
    角色管理源代码:
    upload/2007_05/07051722442920.rar
    注:以上代码取自《ASP.NET 2.0开发指南》一书,感谢原作者

    下一节:登录系列控件

    posted @ 2007-10-08 14:48 blue1000 阅读(841) 评论(1) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    用过baidu空间或者msn的朋友可能为其网站强大的个性化定制功能而耳目一新。其实这些东西并不神秘,在asp.net 2.0中依靠WebParts的灵活功能,我们也可以轻松实现同样的功能。
    WebPart是vs2005的新控件,它的作用是可以使用户在页面上进行控件的拖放,调整位置内容,对控件进行增加,删除,修改等操作.和上节一样,WebParts依然需要SQL Server 2005 Express版本支持。
    下面我们来创建一个简单的WebPart实例,Let's Go!
    首先将左侧工具栏"WebParts" 工具列表中的"WebPartManager"空间拖曳至网页中:

    WebPartManager是一个WebPart的管理控制中心,通过它可以对WebPart的模式进行调整和操作,包括WebPart之间的通信.所以必须首先添加WebPartManager到页面中.WebPartManager在页面运行后不会在前台占用任何位置,他是隐藏的,虽然在设计模式下他是看得见的.
    这里需要说说WebPartManager的五种模式(DisplayMode):
    (1)BrowseDisplayMode:浏览器模式,是默认值.用户只能看不能对Web Part进行操作.
    (2)EditDisplayMode:编辑模式.此模式的运行需要一个EditorZone,然后在EditorZone里可以放AppearanceEditorPart,BehaviorEditorPart,LayoutEditorPart,PropertyGridEditorPart这些控件,他们就是对Web Part进行编辑的控件,可以对Web Part的行为,外观等进行编辑.
    (3)DesignDisplayMode:设计模式.在此模式下,用户就可以对控件的位置进行拖放了(在开始定义好的WebPartZone里)
    (4)CatalogDisplayMode:目录模式.此模式的运行需要一个CatalogZone,CatalogZone有一个模版列,这个模版列里可以放开发人员预先定义好的控件,在HTML模式下在次模列里的控件加Title="需要显示的目录",然后用户就可以把在CatalogZone里的控件放到WebPartZone里.
    (5)ConnectDisplayMode:通讯模式.此模式可以让Web Part进行通讯.可以有两种通讯,静态和动态的.需要设定好提供者和监听者.
    然后再拖曳2个WebPartZone控件到页面中:

    WebPartZone是一个存放WebPart控件容器,有了它之后我们才能在页面中放置WebPart控件.
    接着我们在WebPart控件1中放置一个Calendar日历控件(在工具栏"标准"工具列表中),系统自动将其封装为WebPart控件,这也就是我们网站的内容部分了.当然这里还可以放置服务器控件\用户自定义控件\Web自定义控件等:

    上面说了,WebPartZone是一个存放WebPart控件容器,那么WebPart编辑时的设置框应该放在哪个容器里呢?答案是EditorZone。
    EditorZone是个容器,本身只提供存放区域,所以我们还需要向EditorZone里面添加AppearanceEditorPart、BehaviorEditorPart、LayoutEditorPart、PropertyGridEditorPart这些控件中的一个或多个。他们就是对Web Part进行编辑的控件,可以对Web Part的行为,外观等进行编辑.这里不做细讲。
    先拖曳进来一个EditorZone,然后向EditorZone中添加一个AppearanceEditorPart:

    同理我们还需要一个CatalogZone控件来显示和管理页面中的控件列表。CatalogZone控件也是一个容器,所以我们还需要向它里面添加DeclarativeCatalogPart、PageCatalogPart、ImportCatalogPart控件中的至少一个.
    这里我们添加一个PageCatalogPart控件到CatalogZone控件中:

    PageCatalogPart控件将以列表显示当前页面剩余的可用WebPart控件并允许将其添加至页面中.
    因为本例中只有1个WebPart控件,所以不存在WebPart控件之间的通讯问题,所以WebPartManager的ConnectDisplayMode模式本文就不涉及了.
    最后我们需要做一个下拉菜单,方便我们选择WebPartManager的几种模式,以便查看以上各种控件的应用方式.
    在工具栏"标准"工具列表中将DropDownList控件添加至页面,并为其添加4个Item项,分别对应WebPartManager的4种模式:

     

    DropDownList控件后台事件方法如下:

        protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
        {
            switch (DropDownList1.SelectedValue)
            {
                case "Browse":
                    this.WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode;
                    break;
                case "Edit":
                    this.WebPartManager1.DisplayMode = WebPartManager.EditDisplayMode;
                    break;
                case "Design":
                    this.WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;#p#分页标题#e#
                    break;
                case "Catalog":
                    this.WebPartManager1.DisplayMode = WebPartManager.CatalogDisplayMode;
                    break;
                case "Connect":
                    this.WebPartManager1.DisplayMode = WebPartManager.ConnectDisplayMode;
                    break;
            }
        }

    至此,我们的WebPart之旅就结束了,下面.aspx页面的部分代码:

     

        <form id="form1" runat="server">
        <div>
            <asp:WebPartManager ID="WebPartManager1" runat="server">
            </asp:WebPartManager>
       
        </div>
            <asp:WebPartZone ID="WebPartZone1" runat="server">
                <ZoneTemplate>
                    <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
                </ZoneTemplate>
            </asp:WebPartZone>
            WebPartZone1
            <br />
            <br />
            <asp:WebPartZone ID="WebPartZone2" runat="server">
            </asp:WebPartZone>
            WebPartZone2&nbsp;<br />
            <br />
            <asp:EditorZone ID="EditorZone1" runat="server">
                <ZoneTemplate>
                    <asp:AppearanceEditorPart ID="AppearanceEditorPart1" runat="server" />
                </ZoneTemplate>
            </asp:EditorZone>
            <br />
            <asp:CatalogZone ID="CatalogZone1" runat="server">
                <ZoneTemplate>
                    <asp:PageCatalogPart ID="PageCatalogPart1" runat="server" />
                </ZoneTemplate>
            </asp:CatalogZone>
            <br />
            <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
                <asp:ListItem>Browse</asp:ListItem>
                <asp:ListItem>Edit</asp:ListItem>
                <asp:ListItem>Design</asp:ListItem>
                <asp:ListItem>Catalog</asp:ListItem>
            </asp:DropDownList>
           
        </form>

    完整项目源代码打包:
    upload/2007_05/07051600539435.rar

    以下是部分运行效果截图:

     
    #p#分页标题#e#
     
     
     
    通过本节的演练,大家已经感觉到asp.net 2.0的强大了吧?强大的还在后边呢,嘿嘿。下节学习:成员资格和角色管理

    posted @ 2007-10-08 14:46 blue1000 阅读(730) 评论(0) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    本节一起学习Asp.net 2.0的个性化服务解决技术框架:个性化用户配置。
    什么是个性化用户配置呢?以下是引自网上Daniel Pang朋友的讲述:

    存储和访问用户配置数据一直是开发人员关注的热点。在ASP.NET 1.x时代,实现这一功能主要通过Session、Application等对象或者采用数据库存储的方法。这两种方法都有着本身不可克服的缺点。例如,使用前者容易发生数据丢失的情况,而使用后者比较繁琐,例如,需要自行设计实现数据库及访问数据的代码。为了解决以上问题,ASP.NET 2.0新增了个性化用户配置功能。
    个性化用户配置功能主要用于存储单个用户配置数据,这些数据可以是简单数据类型,也可以是复杂数据类型,甚至自定义对象等。同时,单个用户既可以是匿名用户,也可以是注册用户。默认情况下,所有用户配置数据都存储在SQL Server数据库中,并且无需自行创建和维护该数据库,这些工作都由ASP.NET 2.0自动完成。个性化用户配置功能还支持从应用程序中任何位置访问的多种强类型API,以方便存储、显示和管理用户配置信息。使用个性化用户配置功能非常简单。首先,在Web.config文件中定义配置信息名称、数据类型等,然后,调用与用户配置功能有关的强类型API,例如,Profile实现对用户配置信息的存储、访问和管理等应用。

    开发环境要求:visual studio 2005 + SQL Server 2005
    如果你的数据库不是SQL Server 2005,请先根据如下教程进行环境配置:
    http://www.itgao.com/html/2007-05/45481.html
    程序目标:记录用户个性化数据(本例以匿名用户为例)

    第一步进行web.config配置,启用和定义为用户存储和跟踪的配置信息。

    <system.web>
        <profile>
          <properties>
            <add name="Name" allowAnonymous="true" />
            <add name="LastSubmit" type="System.DateTime" allowAnonymous="true"/>
            <group name="Address">
              <add name="City"  allowAnonymous="true"/>
              <add name="PostalCode"  allowAnonymous="true"/>
            </group>
          </properties>
      </profile>
    </system.web>

    上述配置定义了一个Name属性和Address组属性,而Address组属性里又包含了City和PostalCode属性,默认这些属性值都是string类型,当然我们也可以通过type="值类型"的方式显式规定其类型。allowAnonymous="true"规定了该配置支持匿名用户。

    第二步配置SQL Server 数据库配置。
    默认情况下,程序第一次执行该配置时会自动创建一个SQL Server 2005 Express (visual studio 2005安装时默认附带)的特定数据库实例。该数据库实例存放于应用程序根目录下的App_Data文件夹中,名字是ASPNETDB.MDF,它默认包含了存储用户配置信息的数据表和其他与用户配置相关的对象等。
    所以,如果你使用的是SQL Server 2005的话,这一步可以省略。如果不是,请参考: http://www.itgao.com/html/2007-05/45481.html

    第三步程序实现。
    .aspx页面部分代码:

        <form id="form1" runat="server">
            <div>
                <fieldset style="width: 300px">
                    <legend class="mainTitle">实现匿名用户个性化用户配置</legend>
                    <br />
                    <table border="0" width="90%" class="commonText" align="center" cellpadding="5">
                        <tr>
                            <td>
                                用户姓名:</td>
                            <td>
                                <asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
                        </tr>#p#分页标题#e#
                        <tr>
                            <td>
                                所在国家:</td>
                            <td>
                                <asp:TextBox ID="txtCity" runat="server"></asp:TextBox></td>
                        </tr>
                        <tr>
                            <td>
                                邮政编码:</td>
                            <td>
                                <asp:TextBox ID="txtPostalCode" runat="server"></asp:TextBox></td>
                        </tr>
                        <tr>
                            <td colspan="2" align="center">
                                <asp:Button ID="btnSubmit" runat="server" Text="提交" OnClick="btnSubmit_Click" />
                            </td>
                        </tr>
                    </table>
                </fieldset>
            </div>
        </form>

    后台.cs文件代码:

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                //显示用户配置信息
                DisplayProfileInfo();
            }
        }
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            //保存用户配置信息到Profile属性中
            Profile.Name = txtName.Text;
            Profile.Address.City = txtCity.Text;
            Profile.Address.PostalCode = txtPostalCode.Text;
            //显示用户配置信息
            DisplayProfileInfo();
        }
        private void DisplayProfileInfo()
        {
            //从Profile属性中获取数据并赋值给服务器控件           
            txtName.Text = Profile.Name;
            txtCity.Text = Profile.Address.City;
            txtPostalCode.Text = Profile.Address.PostalCode;
        }
    }

    运行结果:
    应用程序会将用户输入的用户名及国家信息等存放于数据库中,并且自动为用户生成唯一ID编号,客户端表示通常以Cookies的方式存放于客户端电脑上,有效期大约在60天左右。这样应用程序就很方便的储存了用户的个人设置信息,为程序的个性化服务提供了前提。#p#分页标题#e#

    下一节我们将一起学习Asp.Net 2.0个性化服务 Web部件。

    posted @ 2007-10-08 14:45 blue1000 阅读(504) 评论(0) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    前面学习了数据源控件和数据绑定控件,今天我们将要学习的是:数据缓存。
    接触过asp.net 1.x版本的朋友可能会说,这不是个新东西了。是的,数据缓存确实不是asp.net 2.0的新产物,但是asp.net 2.0赋予数据缓存更多属性和方法,让数据缓存可以在asp.net 2.0时代大展雄风。
    数据缓存将频繁被请求的内容存贮在服务器端缓存中,以便这些内容被再次请求时可以更加迅速的反应,并且很有效的降低了服务器的资源占用,提升了程序的运行性能。
    asp.net 2.0支持以下几种缓存方案:

    1、页面输出缓存
    页面输出缓存是一种传统级别的相对简单的缓存机制。它将页面数据缓存在服务器内存中,当有客户端再次请求这些内容的时候,服务器可以直接将这些页面数据输出,直到数据缓存过期。
    页面输出缓存有两种使用方法:

    使用@ OutputCache指令,常见代码如:

    <%@ OutputCache Duration="60" VaryByParam="sID" Location="Any"%>


    以上例子定义了页面输出缓存有效时间为60s,60s后新建缓存;缓存版本因页面传递的sID参数不同而不同;Location="Any"指定了。

    使用页面输出缓存API
    该方法在页面的程序部分执行,常见代码如:

    Response.Cache.SetExpires(DataTime.Now.AddSeconds(60));

    上句设定页面缓存有效时间为60s。
    关于页面输出缓存的属性还有很多,这里只介绍常用的。详细资料请参见:http://www.itgao.com/html/2007-04/19811.html

    2、页面部分缓存
    有时候我们可能并不希望把整个页面都缓存起来,而只是缓存页面的某个部分。常用方法有3种:

    使用@ OutputCache指令
    这种方法的实质是:将需要缓存的这部分内容做成用户自定义控件,然后为自定义控件设置页面缓存代码,方法同页面输出缓存。

    使用PartialCachingAttribute类
    该方法在用户控件的代码隐藏文件中设置控件的缓存配置内容如下,

    [PartialCaching(20)]
    public partial class NewUserControl:UserControl
    {……}

    使用ControlCachePolicy类
    使用ControlCachePolicy类有以下注意事项。
    一是如果要创建正确有效的ControlCachePolicy类实例以便设置控件缓存,那么必须访问PartialCachingControl类的BasePartialCachingControl.CachePolicy属性(BasePartialCachingControl是PartialCachingControl类的基类)。
    二是ControlCachePolicy实例仅在控件生命周期的Init和PreRender阶段之间,才能成功操作。
    例子代码:
    使用PartialCachingAttribute类实现设置用户控件缓存(用户控件代码隐藏文件)

    [PartialCaching(100)]

    public partial class SimpleControl : UserControl
    {......}

    ASP.NET页面文件源代码。
    使用ControlCachePolicy类实现设置用户控件缓存(ASP.NET页面文件)

    <%@ Page Language="C#" Debug="true" %>
    <%@ Reference Control="SimpleControl.ascx" %>
    <script language="C#" runat="server">

    void Page_Init(object sender, System.EventArgs e)
    {
     // 动态加载用户控件,并返回PartialCachingControl的实例对象
     PartialCachingControl pcc = LoadControl("SimpleControl.ascx") as PartialCachingControl;
     // 通过CachePolicy属性获取ControlCachePolicy实例
     ControlCachePolicy cacheSettings = pcc.CachePolicy;
     // 如果用户控件的缓存过期设置大于60秒,则设置新的过期时间为30秒,并将其设置为绝对过期策略
     if (cacheSettings.Duration > TimeSpan.FromSeconds(60)) {
      // 设置用户控件过期时间和缓存过期策略
      cacheSettings.SetExpires(DateTime.Now.Add(TimeSpan.FromSeconds(30)));
      cacheSettings.SetSlidingExpiration(false);
     }
     // 将用户控件添加到页面控件层次结构中
     Controls.Add(pcc);
    }
    </script>

    3、应用程序数据缓存
    应用程序数据缓存的主要功能是在内存中存储各种与应用程序相关的对象。方法有三种:

    指定键和值

    Cache["keyName"] = "123";

    该语句将新建或者重写名称为txtName的缓存,并赋值为123。

    使用Add方法

    Cache.Add("keyName","123",null,DataTime.Now.AddSeconds(60),TimeSpan.Zero,CacheItemPriority.High,onRemove);

    该句实现上例同样的功能,并设定其缓存依赖项为null;缓存有效时间为60s;最后一次访问所添加对象时到该对象过期时间的时间间隔为零(TimeSpan.Zero);缓存对象优先级为High;当缓存被删除时调用委托名称为onRemove。

    使用Insert方法
    Insert方法和Add方法使用方法基本一致,但Insert方法还有几种自己的重载后的方法,例如:

    Cache.Insert("keyName","123");

    4、缓存依赖
    缓存的好处很多,但他也有弊端。比如说数据的实时性,用户获取的页面可能是几十秒甚至是几个小时以前的服务器缓存信息,这一点对于实时性要求比较高的程序来说是不可容忍的。这时候我们可以通过设定缓存依赖,通过对依赖文件的更改变动情况的判断,来决定程序是否需要重建(刷新)缓存。
    缓存依赖的方式有很多种,这里我们着重讲解自定义依赖缓存:

    自定义缓存依赖
    代码:

    string fileName = Server.MapPath("file.xml");//设置文件路径
    DateTime dt = DateTime.Now;//设置跟踪依赖文件的开始时间
    CacheDependency dep = new CacheDependency(fileName,dt);//创建依赖对象#p#分页标题#e#
    Cache.Insert("keyName","value",dep);//添加具有依赖的应用程序数据缓存

    除此之外,asp.net 2.0还支持SQL数据缓存依赖及聚合类型缓存依赖,考虑到章节的长度及内容的复杂性,我们不做多的讲解,详细请查阅:http://www.itgao.com/html/2007-05/45479.html

    下一节内容:个性化用户配置

    posted @ 2007-10-08 14:44 blue1000 阅读(935) 评论(0) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    使用Asp.Net 2.0技术实现数据访问及显示,主要依靠两种类型的服务器控件:数据源控件和数据绑定控件。数据源控件我们前几节已经讲述过了,本节讲述数据绑定控件。
    数据绑定控件包括GridView控件、DetailsView控件、FormView控件。

    1、GridView数据绑定控件
    功能:GridView控件提供数据的显示、排序、添加、修改、删除功能。
    创建:因为GridView控件依赖于数据源控件,所以在创建GridView控件以前必须首先创建一个数据源控件,如SqlDataSource数据源控件。
    首先创建数据源控件SqlDataSource1,方法见http://www.itgao.com/html/2007-05/45444.html。记得一定要设定SqlDataSource1的SelectCommand属性值,以便将数据库中数据查询出来供GridView使用:

     

    然后再设置其UpdateCommand属性值,供GridView更新数据时使用:

    将左侧工具箱中数据选项栏里的“GridView”控件拖到页面中,在GridView任务里选择数据源并选中"启用分页"及"启用编辑"选项。

    这里我们套用一下格式:

    运行一下:

    程序页面代码:

    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:myradioConnectionString %>"
                ProviderName="<%$ ConnectionStrings:myradioConnectionString.ProviderName %>"
                SelectCommand="SELECT [AnnounceID], [UserName], [ip] FROM [Dv_bbs1] ORDER BY [AnnounceID] DESC" UpdateCommand="UPDATE [Dv_bbs1] SET [UserName]=@UserName,[ip]=@ip WHERE [AnnounceID]=@AnnounceID ">
                <UpdateParameters>
                    <asp:Parameter Name="AnnounceID" />
                    <asp:Parameter Name="UserName" />
                    <asp:Parameter Name="ip" />
                </UpdateParameters>
            </asp:SqlDataSource>
       
        </div>
            <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AutoGenerateColumns="False"
                CellPadding="4" DataKeyNames="AnnounceID" DataSourceID="SqlDataSource1" ForeColor="#333333"
                GridLines="None">
                <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <Columns>
                    <asp:CommandField ShowEditButton="True" />
                    <asp:BoundField DataField="AnnounceID" HeaderText="AnnounceID" InsertVisible="False"
                        ReadOnly="True" SortExpression="AnnounceID" />
                    <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />#p#分页标题#e#
                    <asp:BoundField DataField="ip" HeaderText="ip" SortExpression="ip" />
                </Columns>
                <RowStyle BackColor="#EFF3FB" />
                <EditRowStyle BackColor="#2461BF" />
                <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
                <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
                <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
                <AlternatingRowStyle BackColor="White" />
            </asp:GridView>
        </form>
    </body>
    </html>

    如果我们还想细化一下,比如说想把某个列改为链接显示或者在每一列添加复选框等,我们都可以通过对Columns节中Field进行更改和设置,比如说改称HyperLinkField或者CheckBoxField等。具体教程你可以查阅 http://www.itgao.com/
    另外,GridView数据绑定控件的属性还有很多,你可以查看其属性面板来慢慢熟悉它们,或进入 http://www.itgao.com/ 进行查阅搜索。当然,它们都非常有用哦。

    2、DetailsView数据绑定控件
    DetailsView数据绑定控件大部分功能和GridView数据绑定控件基本一样,但是他们也有不同的地方:
    DetailsView数据绑定控件注重显示记录细节内容,所以它每次只显示一条;DetailsView数据绑定控件比GridView数据绑定控件多一个添加数据功能。
    创建方法:和GridView一样,首先应创建数据源控件,并添加SelectCommand、UpdateCommand、InsertCommand属性值(供DetailsView数据源绑定控件添加新数据时使用)。
    将左侧工具箱中数据选项栏里的“DetailsView”控件拖到页面中,在DetailsView任务里选择数据源并选中"启用分页"及"启用编辑"等等选项。

    运行:

    程序页面代码:

    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:myradioConnectionString %>"
                ProviderName="<%$ ConnectionStrings:myradioConnectionString.ProviderName %>"
                SelectCommand="SELECT [AnnounceID], [UserName], [ip] FROM [Dv_bbs1] ORDER BY [AnnounceID] DESC" UpdateCommand="UPDATE [Dv_bbs1] SET [UserName]=@UserName,[ip]=@ip WHERE [AnnounceID]=@AnnounceID " InsertCommand="INSERT INTO Dv_bbs1(UserName, ip) VALUES (@UserName,@ip)">
                <UpdateParameters>
                    <asp:Parameter Name="AnnounceID" />
                    <asp:Parameter Name="UserName" />
                    <asp:Parameter Name="ip" />
                </UpdateParameters>
                <InsertParameters>
                    <asp:Parameter Name="UserName" />
                    <asp:Parameter Name="ip" />#p#分页标题#e#
                </InsertParameters>
            </asp:SqlDataSource>
       
        </div>
            <asp:DetailsView ID="DetailsView1" runat="server" AllowPaging="True" AutoGenerateRows="False"
                BackColor="White" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px"
                CellPadding="3" DataKeyNames="AnnounceID" DataSourceID="SqlDataSource1" GridLines="Horizontal"
                Height="50px" Width="125px">
                <FooterStyle BackColor="#B5C7DE" ForeColor="#4A3C8C" />
                <EditRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="#F7F7F7" />
                <RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
                <PagerStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" HorizontalAlign="Right" />
                <Fields>
                    <asp:BoundField DataField="AnnounceID" HeaderText="AnnounceID" InsertVisible="False"
                        ReadOnly="True" SortExpression="AnnounceID" />
                    <asp:BoundField DataField="UserName" HeaderText="UserName" SortExpression="UserName" />
                    <asp:BoundField DataField="ip" HeaderText="ip" SortExpression="ip" />
                    <asp:CommandField ShowEditButton="True" ShowInsertButton="True" />
                </Fields>
                <HeaderStyle BackColor="#4A3C8C" Font-Bold="True" ForeColor="#F7F7F7" />
                <AlternatingRowStyle BackColor="#F7F7F7" />
            </asp:DetailsView>
        </form>
    </body>
    </html>

    注:像大多数控件一样,你可以使用DetailsView的模版编辑功能来设计自己个性化的DetailsView数据源绑定控件.

    3、FormView数据绑定控件
    FormView数据源绑定控件拥有DetailsView控件一样的功能。但是,FormView数据源绑定控件相对于GridView控件和DetailsView控件将界面及程序的处理权限下放至更底层,你可以利用它的模版对界面的显示方式进行精确的控制,也可以以编程的方式访问FormView对象模型来动态设置其属性、处理事件等。但所有的事物都有两面性,正式因为其灵活,所以使用起来相对比较麻烦。
    创建方法:FormView数据源绑定控件添加方法同上,直接将FormView拖放至页面即可。我们通过FormView任务属性为其选择数据源、启用分页等功能:

    最后我们还可以通过点击“编辑模版”进入模版编辑状态,对数据的显示方式进行细化调整:

    运行:

    页面代码:

    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:myradioConnectionString %>"#p#分页标题#e#
                ProviderName="<%$ ConnectionStrings:myradioConnectionString.ProviderName %>"
                SelectCommand="SELECT [AnnounceID], [UserName], [ip] FROM [Dv_bbs1] ORDER BY [AnnounceID] DESC" UpdateCommand="UPDATE [Dv_bbs1] SET [UserName]=@UserName,[ip]=@ip WHERE [AnnounceID]=@AnnounceID " InsertCommand="INSERT INTO Dv_bbs1(UserName, ip) VALUES (@UserName,@ip)">
                <UpdateParameters>
                    <asp:Parameter Name="AnnounceID" />
                    <asp:Parameter Name="UserName" />
                    <asp:Parameter Name="ip" />
                </UpdateParameters>
                <InsertParameters>
                    <asp:Parameter Name="UserName" />
                    <asp:Parameter Name="ip" />
                </InsertParameters>
            </asp:SqlDataSource>
       
        </div>
            <asp:FormView ID="FormView1" runat="server" AllowPaging="True" DataKeyNames="AnnounceID"
                DataSourceID="SqlDataSource1">
                <EditItemTemplate>
                    AnnounceID:
                    <asp:Label ID="AnnounceIDLabel1" runat="server" Text='<%# Eval("AnnounceID") %>'>
                    </asp:Label><br />
                    UserName:
                    <asp:TextBox ID="UserNameTextBox" runat="server" Text='<%# Bind("UserName") %>'>
                    </asp:TextBox><br />
                    ip:
                    <asp:TextBox ID="ipTextBox" runat="server" Text='<%# Bind("ip") %>'>
                    </asp:TextBox><br />
                    <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update"
                        Text="更新">
                    </asp:LinkButton>
                    <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="取消">
                    </asp:LinkButton>
                </EditItemTemplate>
                <InsertItemTemplate>
                    UserName:
                    <asp:TextBox ID="UserNameTextBox" runat="server" Text='<%# Bind("UserName") %>'>
                    </asp:TextBox><br />#p#分页标题#e#
                    ip:
                    <asp:TextBox ID="ipTextBox" runat="server" Text='<%# Bind("ip") %>'>
                    </asp:TextBox><br />
                    <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert"
                        Text="插入">
                    </asp:LinkButton>
                    <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel"
                        Text="取消">
                    </asp:LinkButton>
                </InsertItemTemplate>
                <ItemTemplate>
                    <strong>AnnounceID:</strong>
                    <asp:Label ID="AnnounceIDLabel" runat="server" Text='<%# Eval("AnnounceID") %>'></asp:Label><br />
                    <strong>UserName: </strong>
                    <asp:Label ID="UserNameLabel" runat="server" Text='<%# Bind("UserName") %>'></asp:Label><br />
                    <strong>ip:</strong>
                    <asp:Label ID="ipLabel" runat="server" Text='<%# Bind("ip") %>'></asp:Label><br />
                    <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit"
                        Text="编辑"></asp:LinkButton>
                    <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New"
                        Text="新建"></asp:LinkButton>
                </ItemTemplate>
            </asp:FormView>
        </form>
    </body>
    </html>

    上面只是几个简单的例子,数据源绑定控件的功能比我们想象的还要强大,要用好它们就需要我们多多学习他们的属性\方法\事件等,多多实践总结.

    接下来我们会接触到的是:数据缓存

    posted @ 2007-10-08 14:42 blue1000 阅读(914) 评论(0) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    上一节我们讲述了SqlDataSource和AccessDataSource这两个.net数据源控件中的重要成员,本节我们接着讲述.net数据源控件中的XmlDataSource控件、SiteMapDataSource控件和ObjectDataSource控件。

    1、XmlDataSource控件
    XmlDataSource控件是针对层次化数据源中的xml而设计的。层次化数据源还包扩文件夹列表、网站地图等。
    创建方法:将vs2005左侧“数据”选项栏中的XmlDataSource控件拖放至.aspx页面的设计界面中。利用“XmlDataSource任务”设置框中的“配置数据源”菜单,我们可以对XmlDataSource控件的数据源进行设置:

    Xml路径用来给XmlDataSource控件的DataFile属性赋值;转换文件路径赋值给TransformFile属性;XPath赋值给XPath属性。

    什么是Xml?
    简单的说,http://www.itgao.com/rssFeed.aspx的代码就是xml内容(只是扩展名由.xml改成了.aspx而已)。
    关于Xml的信息请查阅:http://www.itgao.com/html/2007-05/45447.html

    什么是转换文件?
    XSL文件本身也是XML格式文件,其内容指明了如何转换XML数据。其中的foreach, 明显带有程序循环的意味。,也跟使用CSS一样,XML文件中只在第二行加了一行<?xml-stylesheet type="text/xsl" href="../../simple.xsl" ?>
    更多相关信息:http://www.itgao.com/search.aspx?keyword=XSLT%C7%E1%CB%C9%C8%EB%C3%C5&where=title

    什么是XPath?
    XPath是一种查询语言,用于检索Xml文档节点中包含的信息。本例因为http://www.itgao.com/rssFeed.aspx中的数据存放于rss/channel/item节点中,所以我们将XPath赋值为“rss/channel/item”。
    关于XPath的信息请查阅:http://www.itgao.com/html/2007-04/17096.html

    XmlDataSource控件的属性本身就很少,所以配置起来比较简单。

    2、SiteMapDataSource控件
    看到这个名字大家肯定很眼熟吧?我们在前面学习网站导航控件(http://www.itgao.com/html/2007-05/45404.html)时不只一次的用到过,所以它的使用方法不再累述。这里我们只说说它的应用范围和注意事项:
    SiteMapDataSource控件是Asp.Net 2.0中专门用于连接和访问站点地图文件(*.sitmap)的数据源控件。并可以将访问到的数据直接应用到网站导航控件中,当然,还有其它控件。
    下面是它的几个常用属性:
    ShowStartingNode: bool值,用于配置SiteMapDataSource控件是否显示节点树中的根节点。
    StartingNodeUrl: 该属性设置SiteMapDataSource控件应该从节点树的哪个节点开始。
    StartFromCurrentNode: bool值,用于设置是否从当前页面所在的节点位置开始读取该节点及其子节点的数据。
    StartingNodeOffset: 整数,用于设置起始节点的偏移量。默认值为0。如果设置为-1,则从父级节点开始读取数据;如果为1,则从子节点开始读取数据。依次类推。
    SiteMapDataSource控件不具有多数数据源控件所支持的数据缓存、排序、过滤、分页、添加、删除和修改等能力。

    3、ObjectDataSource控件
    有人说ObjectDataSource控件是为程序的N层构架而生了,比喻相当生动,当然也不无道理。以下是关于N层构架的文章,建议朋友们有时间多读读:
    解读三层构架:http://www.itgao.com/html/2007-05/45448.html
    N层系统架构设计应考虑的几个方面:http://www.itgao.com/html/2007-05/45449.html
    图:三层构架示意图

    ObjectDataSource控件与其它数据源控件不同的是,该控件能够帮助开发人员在表示层与数据访问层、表示层与业务逻辑层之间架起一座桥梁,从而将来自数据访问层或者业务逻辑层的数据对象,与表示层中的数据绑定控件绑定,实现数据的显示和编辑等。
    ObjectDataSource控件创建方法还是从vs2005左侧“数据”选项栏中,将的ObjectDataSource控件拖放至.aspx页面的设计界面中即可。这时候我们会发现ObjectDataSource控件与SqlDataSource控件在属性方面有很多不同。ObjectDataSource控件不存在ConnectionString、ProviderName、SelectCommand等属性,替而代之,出现了TypeName、SelectMethod等属性。这些新的属性将用来指示ObjectDataSource控件实例使用哪个业务类以及哪种方法来检索或编辑数据。而这些业务类和方法来自于数据访问层或业务逻辑层。
    先来看看ObjectDataSource控件的声明代码吧:
    <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" TypeName="ComponentClassName" SelectMethod="GetRecords"></asp:ObjectDataSource>
    代码中,TypeName属性用于设置相关业务类的名称;SelectMethod属性用于设置该业务类中实现检索数据源数据的方法名称。该业务类的方法必须返回一个可枚举的列表对象,如:集合、数组、DataSet、DataReader等,或者返回包含数据的业务实体对象。
    除此之外,ObjectDataSource控件还有InsertMethod、UpdateMethod、DeleteMethod等属性,属性值仍然是该业务类中的方法名称。

    ObjectDataSource控件是asp.net 2.0的精华部分,但也是比较复杂的一部分。它的属性众多,事件、方法也有一大堆,这里不想照本宣科了,大家多看看msdn就知道了。#p#分页标题#e#
    ObjectDataSource控件具体的使用方法我们以后的教程中会多次接触的,所以这里只讲述他的运行机理和部分属性,不再多说,相关实例请参考:http://www.itgao.com/html/2007-05/45455.html

    至此我们完成了asp.net数据源控件的初步接触,熟悉了它们的创建方法和部分属性。至于它们在程序中是如何借助数据绑定控件发挥作用的,请看下一节:Asp.Net 2.0 数据绑定控件

    posted @ 2007-10-08 14:41 blue1000 阅读(525) 评论(3) 编辑

    尊重作者,请保留 www.it55.com 链接字样。

    在没有讲述 数据源控件 之前,我们先来认识一下数据源控件、数据绑定控件之间的关系。
    数据源控件封装所有获取和处理数据的功能,主要包括连接数据源、使用Select、Update、Delete和Insert等对数据进行管理。数据绑定控件主要用于将数据于前台显示出来。通常情况下,我们常常先用数据源控件取得数据集合,然后使用数据绑定控件将数据集合绑定并呈现在页面上。
    数据绑定控件包括GridView、DetailsView、FormView、TreeView、Menu等;数据源控件包括SqlDataSource、AccessDataSource、ObjectDataSource、XmlDataSource、SiteMapDataSource,后者正是我们接下来几节要学习的内容。

    以上5个数据源控件我们都可以通过vs2005左侧工具栏,在“数据”选项栏中拖拉至页面来完成调用,当然和其他控件一样我们也可以直接在.aspx页面文件中以代码的方式进行调用。

    1、SqlDataSource控件。

    .aspx页面中的基本声明代码:

    <asp:SqlDataSource Id="控件Id" runat="server" ConnectionString="连接数据源字符串" ProviderName="数据提供程序" SelectCommand="查询用的SQL语句" UpdateCommand="更新用的SQL语句" DeleteCommand="删除用的SQL语句" InsertCommand="写入用的SQL语句" DataSourceMode="获取数据后数据返回的模式"></asp:SqlDataSource>

    常用属性介绍:
    关于属性的设置,我们都可以在页面的设计界面中点选SqlDataSource控件,然后在右侧属性选项卡中进行查看和修改。当我们选择某项属性时,属性选项卡下方的提示区域将会显示该属性的含义及用途,而该属性后面的值区域则有可能会出现值列表以供选择。

    这里我们只介绍常用属性,其他属性大家可以通过以上方法进行查看和尝试。
    Id:控件id,就像一个人的身份证号一样,一个页面中不能有重复。
    ConnectionString:连接数据源的字符串,关于连接字符串请参考:http://www.itgao.com/html/2007-04/20550.html
    ProviderName:获取或设置SqlDataSource控件连接数据源时所使用的提供程序名称。
    SelectCommand:查询用的SQL语句或者存储过程名称
    SelectCommandType:SelectCommand属性的值的类型,包含Text(文本型)和StoreProcedure(存储过程)
    UpdateCommand:更新用的SQL语句或者存储过程名称
    UpdateCommandType:UpdateCommand属性的值的类型,包含Text(文本型)和StoreProcedure(存储过程)
    DeleteCommand:删除用的SQL语句或者存储过程名称
    DeleteCommandType:DeleteCommand属性的值的类型,包含Text(文本型)和StoreProcedure(存储过程)
    InsertCommand:写入用的SQL语句或者存储过程名称
    InsertCommandType:InsertCommand属性的值的类型,包含Text(文本型)和StoreProcedure(存储过程)
    DataSourceMode:获取数据后数据返回的模式,包含两个属性值:DataSet和DataReader,默认为DataSet

    创建数据库连接:
    vs2005可视化界面下,我们对SqlDataSource的某些属性进行配置时,系统可能会要求我们事先建立一个可用的数据库连接.毕竟,一个有效的数据库连接是我们对数据库进行操作的基础.
    步骤:对SqlDataSource的"ConnectionString"属性进行修改,如下图:

     

    在"选择数据源"对话框中我们根据自己的数据库类型来选择数据源和数据提供程序.右侧说明区域会提供相应说明.

    如果我们选择Microsoft SQL Server,点击"继续"按钮后,系统会弹出"添加连接设置框",我们只需要根据下图进行设置就可以了:

    如果我们选择Microsoft Access 数据库文件 (OLE DB),点击"继续"按钮后,将需要对以下图中内容进行设置:

    其他几种数据库类型的设置大同小异,在此不再累述.

    配置Command命令语句:
    在正确配置SqlDataSource的Command命令后,SqlDataSource数据源才能正常地对数据库进行各种操作.
    步骤:先拿SelectCommand命令为例.
    对SqlDataSource的"SelectQuery"属性进行修改,如下图:

     

    如果选用查询生成器来生成SQL语句的话,我们需要进行如下操作:

     

     最后“确定”即可。


    同样的操作,配置完你需要的Command命令.

    2、AccessDataSource控件。
    SqlDataSource控件可以访问任何OLEDB或符合ODBC的数据源,也可以访问Oracle数据库,而AccessDataSource控件只能访问Access数据库.
    对AccessDataSource控件来说,必须首先配置其DataFile属性才能继而对Command属性进行很好的配置.

    该属性用于指定需要访问的Access数据库文件(.mdb)的路径.但是需要注意的是,必须首先将数据库文件添加到当前项目中(一般放到App_Data文件夹中)才能顺利的完成配置.#p#分页标题#e#
    添加数据库到项目的方法:
    右侧"服务器资源管理器"选项卡中,数据连接>>>右键"添加连接">>>然后弹出"添加连接"配置框,其配置方法和SqlDataSource控件中的做法相同,但是此时数据源我们只能选择Access,因为我们用的是AccessDataSource控件.

     

    AccessDataSource控件其他属性的配置和SqlDataSource控件基本相同,不再累述.

    明天我们继续学习 数据源控件中的XmlDataSource控件、SiteMapDataSource控件和ObjectDataSource控件。

    posted @ 2007-10-08 14:41 blue1000 阅读(527) 评论(0) 编辑