|
|
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")
尊重作者,请保留 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 控件由通过身份验证和未通过身份验证的用户使用。如果用户未通过身份验证,该控件将提示用户输入登录名。如果用户已通过身份验证,该控件将用用户的登录名填充文本框。
完
尊重作者,请保留 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开发指南》一书,感谢原作者
下一节:登录系列控件
用过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 <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的强大了吧?强大的还在后边呢,嘿嘿。下节学习:成员资格和角色管理
尊重作者,请保留 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部件。
尊重作者,请保留 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
下一节内容:个性化用户配置
尊重作者,请保留 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>
上面只是几个简单的例子,数据源绑定控件的功能比我们想象的还要强大,要用好它们就需要我们多多学习他们的属性\方法\事件等,多多实践总结.
接下来我们会接触到的是:数据缓存
尊重作者,请保留 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 数据绑定控件
尊重作者,请保留 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控件。
尊重作者,请保留 www.it55.com 链接字样。
今天内容比较多一点,我们需要学习asp.net 2.0 其余六个服务器控件,所以马上开始,呵呵。
1、BulletedList控件
作用:用于展示小规模的列表显示,以ul li的方式或者ol li的方式输出;列表项可以以文字、链接、LinkButton的形式出现。
创建方法:
新建web窗体文档并且换至设计界面,将左侧工具栏“标准”选项栏中的BulletedList控件拖放至页面中。
通过“编辑项”进行列表项的添加:
运行效果如下:
各列表项左侧以实心圆点作为行头符,而这个行头符可以通过更改BulletedList的BulletStyle属性来更换其它样式。
需要特别声明的是,如果你的BulletedList控件的列表项是由手工添加 + 后台动态绑定的话,那么你必须将其AppendDataBoundItems属性设置为true.
2、HiddenField控件
作用:将隐藏的数据保存在Value属性中,类似于HTML中的<input type="hidden"/>,只不过该控件运行于服务器端;适于安全要求比较低的参数传递。
创建方法:将左侧工具栏“标准”选项栏中的HiddenField控件拖放至页面中,并通过其属性页为其赋值,当然也可以通过客户端脚本进行赋值。在后台程序中可以获取和设置该值并进行相应判断处理。
3、FileUpload控件
作用:上传文件
创建方法:将左侧工具栏“标准”选项栏中的FileUpload控件拖放至页面中,效果如下图:
我们需要在添加一个按钮来实现上传事件的提交,并将按钮Text属性修改为“上传”,结果如下图:
双击上传按钮,进入页面后台cs文件中,将按钮的Click事件处理函数改为如下:
protected void Button1_Click(object sender, EventArgs e)//Button1为按钮“上传”的ID属性值
{
string path = Server.MapPath("./");//获取当前目录在服务器上的绝对地址,作为图片保存地址。
if (FileUpload1.HasFile)//判断本地需要上传的文件是否已经选取
{
string fileExt = System.IO.Path.GetExtension(FileUpload1.FileName).ToLower();//获取上传文件的扩展名并转换为小写,为下面的上传类型合法性判断作准备
if (fileExt == ".gif" || fileExt == ".jpg")//只允许上传.gif和.jpg格式文件
{
//开始执行上传操作
try
{
FileUpload1.SaveAs(path + FileUpload1.FileName);//服务器端保存该文件
Response.Write("文件上传成功!");
}
catch (Exception ex)
{
Response.Write("文件上传过程中发生错误,错误信息:" + ex.Message);
}
}
else
{
Response.Write("程序只支持上传.gif或.jpg格式的文件!");
}
}
else//如果没有选择本地文件
Response.Write("请先选择文件!");
}
至此,一个简单的文件上传功能已经完成了。需要提醒的是:
FileUpload控件有一个PostedFile属性,利用该属性可以获取与上传文件相关的HttpPostedFile对象,使用该对象可以获取以上传文件的路径、大小、文件类型等属性,如:
在上例中可以通过FileUpload1.PostedFile.ContentLength来获取该上传文件的大小。
4、ImageMap控件
作用:制作图片导航。利用在图片上的一个或多个区域创建热区及链接的方式,制作导航。
创建方法:将左侧工具栏“标准”选项栏中的ImageMap控件拖放至页面中,并通过修改其ImageUrl属性为它添加图片(该图片必须事先通过“添加现有项”,将其加入网站项目中):
然后通过HotSpots属性为其创建一个或多个热区:
至于热区坐标的定位,可算是vs的一大疏漏,我们必须用图片处理工具获得图片预定热区在图片中的坐标和大小,然后才能在vs中很顺利的创建热区。这一点,可比dw差远了。
需要说明的是:后台程序可以根据ImageMap控件的Click事件和PostBackValue属性来获取用户点击的位置。
5、MultiView和View控件
作用:可以实现类似于Windows选项卡的功能。MultiView其实是存放一个或多个View控件的控件容器。
创建方法:
我们来做一个简单的2个View控件的MultiView。
我们先添加2个按钮来触发两个View控件的切换,分别将其Text属性修改为“选项卡1”,“选项卡2”,然后回车换行。将左侧工具栏“标准”选项栏中的MultiView控件拖放至页面中,效果如下图:#p#分页标题#e#
然后将左侧工具栏“标准”选项栏中的View控件拖放至页面MultiView控件中,一共放置2个View控件(拖放两次),然后分别在两个View控件中输入各自的内容,结果图:
鼠标单击选择MultiView控件,将其ActiveViewIndex属性的值更改为0,即:默认第一个View控件被选中激活。(如果是1,则第二个View控件被选中激活)
接着我们来做View控件切换的触发事件。双击按钮“选项卡1”进入后台cs文件中,将其Click函数更改如下:
protected void Button1_Click(object sender, EventArgs e)//Button1为按钮“选项卡1”的ID属性值
{
MultiView1.ActiveViewIndex = 0;//ActiveViewIndex属性:用于获取或设置当前被激活显示的View控件的索引值
}
双击按钮“选项卡2”进入后台cs文件中,将其Click函数更改如下:
protected void Button2_Click(object sender, EventArgs e)//Button2为按钮“选项卡2”的ID属性值
{
MultiView1.ActiveViewIndex = 1;
}
运行后,当我们点击“选项卡1”按钮时,页面显示View1控件的内容;点击“选项卡2”按钮时,页面显示View2控件的内容。
如果我们对内容进行修改,再用css进行一番修饰,就完全可以实现Windows “我的电脑” 属性选项卡的功能了:
6、Wizard控件
作用:实现操作向导的功能。比如“安装向导”、“注册向导”、“分步调查”等。
创建方法:将左侧工具栏“标准”选项栏中的Wizard控件拖放至页面中,在Wizard任务中,点击“添加移除WizardSteps”:
在WizardStep集合编辑器中依次添加WizardStep、修改Title属性值、ID属性值,当WizardStep数量满足你的要求后,点击右下方“确定”按钮。
在设计视图中点击第一步(本例为“用户名”),然后鼠标点击Wizard控件的右半部分,对第一步的内容进行编辑:
然后编辑第二步:
...
在最后一步中,Wizard将出现“完成”按钮,双击完成按钮进入后台cs文件,对用户注册信息进行处理(比如说写进数据库)。
本例运行后效果如下:
本例源码附上:
upload/2007_05/07050816266783.rar
不知不觉大半天过去了,How Time Fly~
明天我们将接触到asp.net 2.0建站的的精髓部分:数据源控件 SqlDataSource控件和AccessDataSource控件
尊重作者,请保留 www.it55.com 链接字样。
站点导航控件可以让你的网站结构清晰、易操作性更强,本节主要涉及asp.net 2.0新特性:站点导航控件。
站点导航控件包括:SiteMapPath控件、TreeView控件、Menu控件等。这些控件都建立在数据源(网站地图)基础上的。网站地图是一种严格的xml文件。所以在讲述上述控件之前,我们必须先建立一个网站地图。
网站地图的建立
在当前项目上鼠标右键>>>添加新项>>>在“添加新项”配置框中选择“网站地图”,因为默认的Web.config名称可以被站点导航控件隐性调用,所以这里我们不改动文件名称。点击“添加”
将Web.sitemap的内容修改如下:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNode url="http://www.itgao.com/" title="首页" description="itgao.com首页">
<siteMapNode url="http://www.itgao.com/web/" title="网站制作" description="网站制作教程">
<siteMapNode url="http://www.itgao.com/Dreamweaver/" title="Dreamweaver" description="Dreamweaver教程" />
<siteMapNode url="http://www.itgao.com/Flash/" title="flash" description="flash教程" />
<siteMapNode url="http://www.itgao.com/standard/" title="web标准" description="web标准" />
</siteMapNode>
<siteMapNode url="http://www.itgao.com/design/" title="图片处理" description="图片处理教程" >
<siteMapNode url="Default.aspx" title="Photoshop" description="Photoshop教程" />
<siteMapNode url="http://www.itgao.com/CorelDRAW/" title="CorelDRAW" description="CorelDRAW教程" />
<siteMapNode url="http://www.itgao.com/Illustrator/" title="Illustrator" description="Illustrator教程" />
</siteMapNode>
<siteMapNode url="http://www.itgao.com/program/" title="程序设计" description="程序设计教程" />
<siteMapNode url="http://www.itgao.com/site/" title="建站资讯" description="建站资讯" />
<siteMapNode url="http://www.itgao.com/server/" title="服务器" description="服务器教程" />
<siteMapNode url="http://www.itgao.com/DataBase/" title="数据库" description="数据库教程" />
<siteMapNode url="http://www.itgao.com/safe/" title="安全防护" description="安全防护教程" />
<siteMapNode url="http://www.itgao.com/office/" title="办公软件" description="办公软件教程" />
</siteMapNode>
</siteMap>
“SiteMapPath”控件应用:
“SiteMapPath”控件可以很方便的在你的页面上建立一个“当前位置”的导航条。
创建方法:新建web窗体,并且换至设计界面。在工具箱中找到“SiteMapPath”控件,并拖至web窗体中。
在vs 2005的设计界面里,我们可以通过“自动套用格式”来快速设置SiteMapPath的样式:
我们还可以通过“编辑模版”来给SiteMapPath某个节点或分隔符设置自定义模版:
本例为了学习内容的简化明了,对此不做设置和讲解。以下是SiteMapPath控件的大部分属性及注释:
#p#分页标题#e#
SiteMapPath默认调用站点根目录下的Web.sitemap作为数据源,但需要注意的是:在Web.sitemap中的所有节点的url属性中有且只能有一个SiteMapPath控件调用页路径(本例为Default.aspx),否则运行后会无法看到SiteMapPath控件。
最终Default.aspx内容:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Culture="auto" meta:resourcekey="PageResource1" UICulture="auto" %>
<!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:SiteMapPath ID="SiteMapPath1" runat="server" meta:resourcekey="SiteMapPath1Resource1" SkipLinkText="">
</asp:SiteMapPath>
</div>
</form>
</body>
</html>
运行效果:

“TreeView”控件应用:
“TreeView”控件可以在你的页面上呈现网站栏目树形结构,可以绑定多种数据源控件,本例仍然使用Web.sitemap作为数据源。因为要使用网站地图作为数据源需要集成SiteMapDataSource控件以实现数据的转换,所以本例在实现过程中需要调用SiteMapDataSource控件。
创建方法:在当前项目中创建web窗体Default2.aspx并且换至设计界面;将左侧工具栏中“数据”选项栏中的“SiteMapDataSource”控件拖放至页面中,命名为“SiteMapDataSource1”,此时“SiteMapDataSource”控件默认会自动绑定网站根目录下的Web.sitemap网站地图文件。
将左侧工具栏中“导航”选项栏中的“TreeView”控件拖放至页面中,并选择SiteMapDataSource1作为其数据源。
此时TreeView已经制作完成。另外,我们可以通过“自动套用格式”来很方便的设置TreeView控件的格式:
还可以通过“编辑节点”来以可视化方式添加TreeView的节点项:
你也可以通过“自定义行图标”来为你的节点添加个性化图标:
最后,如果你选取了“显示行”的复选框,TreeView将以树形线的方式来展示节点结构:
考虑到教程的简洁化,本例不做以上设置。
最后Default2.aspx的内容如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!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:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" ShowLines="True">
</asp:TreeView>
</div>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
</form>
</body>
</html>
运行结果:
“Menu”控件应用:
顾名思义,“Menu”控件的作用就是根据数据源生成网站菜单,可以绑定多种数据源控件,本例仍然使用Web.sitemap作为数据源。“Menu”控件的创建方法和“TreeView”控件大同小异:#p#分页标题#e#
首先创建“SiteMapDataSource”数据源;然后在“导航”中的“Menu”控件拖拉至页面中,并选择数据源为SiteMapDataSource1:
因为在网站地图文件Web.sitemap中,只有“首页”是根节点,所以默认我们的Menu控件只显示“首页”菜单,这和我们的要求是有差别的。我们需要显示所有二级节点的菜单,所以我们必须对SiteMapDataSource1做如下设置:
鼠标点选“SiteMapDataSource1”数据源控件,在右侧属性中更改ShowStartingNode属性值为false:
菜单默认是竖直显示的,为了使菜单能够水平显示,我们需要鼠标点选Menu控件后,将其Orientation属性值改为“Horizontal”:
Web窗体Default3.aspx最终代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
<!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:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="False" />
<asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" Orientation="Horizontal">
</asp:Menu>
</div>
</form>
</body>
</html>
最终显示效果:
本节主要讲述了站点导航控件(SiteMapPath、TreeView、Menu)的用法,只要多多实践,大家就可以掌握个中蹊跷。
下一节,我们将一起学习:Asp.Net 2.0新特性 其它服务器控件 BulletedList控件、HiddenField控件、FileUpload控件、ImageMap控件、MultiView和View控件、Wizard控件
尊重作者,请保留 www.it55.com 链接字样。
这一节我们联系asp.net 2.0新特性:主题和皮肤。
主题和皮肤的制作
新建web网站,在项目上右键“添加ASP.NET文件夹”>>>“主题”,并将默认生成的“主题1”重命名为“blue”:
在blue主题上右键“添加新项”,
弹出的设置框中选择“外观文件”,并命名为“button.skin”,最后“添加”
修改button.skin内容如下:
<%--
默认的外观模板。以下外观仅作为示例提供。
1. 命名的控件外观。SkinId 的定义应唯一,因为在同一主题中不允许一个控件类型有重复的 SkinId。
<asp:GridView runat="server" SkinId="gridviewSkin" BackColor="White" >
<AlternatingRowStyle BackColor="Blue" />
</asp:GridView>
2. 默认外观。未定义 SkinId。在同一主题中每个控件类型只允许有一个默认的控件外观。
<asp:Image runat="server" ImageUrl="~/images/image1.jpg" />
--%>
<asp:Button runat="server" BackColor="LightSteelBlue" BorderStyle="None" ForeColor="Navy" />
<asp:Button runat="server" BackColor="LightSteelBlue" BorderStyle="Groove" ForeColor="Navy" Text="Button" BorderColor="RoyalBlue" SkinID="withBorder" />
在blue主题上右键“添加新项”,弹出的设置框中选择“样式表”,并命名为“style.css”,最后“添加”
style.css内容如下:
body { text-align:center; background-color:Gray;
}
Default.aspx内容:
<%@ Page Language="C#" AutoEventWireup="true" Theme="blue" 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>
整个页面因为应用了blue主题中的style.css,所以内容居中,背景为灰色
<br />
<asp:Button ID="Button1" runat="server" Text="Button" /><br />这个按钮没有设置SkinId,就调用默认外观
<br />
<br />
<asp:Button ID="Button2" runat="server" Text="Button" SkinID="withBorder" /><br />这个按钮将根据SkinId调用特定外观
</div>
</form>
</body>
</html>
注:如果页面中的控件有自己的样式或外观定义,那么该定义将覆盖主题的定义。运行结果:
关于主题的应用
上述在页面头部通过Theme="主题名称"来应用主题的方式是页面级主题应用;应用程序级主题应用方法如下:
在Web.config文件中配置如下节:
<configuration>
<system.web>
<pages Theme="主题名称" />
</system.web>
</configuration>
注:某个文件夹下的Web.config中的Theme设置将覆盖应用程序的Theme设置.
关于动态加载主题
因为page对象的Theme属性只能在页面的PreInit事件发生过程中或者之前进行设置,所以我们必须在Page_PreInit事件处理程序中修改Theme属性值,以达到动态调用主题的目的.
具体实现方法就不再叙述了,大家可以查看这篇文章:Asp.net 2.0中动态加载主题的两种实现方法
关于主题和样式的内容的基础内容大概只有这些了,下一节我们将一起学习: asp.net 2.0新特性 站点导航控件
尊重作者,请保留 www.it55.com 链接字样。
过完五一了,一身的臭汗,想洗个澡先。但最后还是决定先把今天的课程写了再作其他事情。
我们做网站的时候经常会出现这种情况:每个页面都要有头部和尾部,而这些头部或尾部大多数时间都是一模一样的,重复性的劳动让我们显得很无奈。asp程序员通过include来解决这个问题,asp.net 1.X程序员通过自定义控件来实现公共部分的重用。但这些方法都有无法回避的弊端,asp.net提供给我们了另一种新的解决方案,那就是母版技术。
1、简单母版应用
在当前项目上右键单击>>>添加新项
在弹出的“添加新项”对话框的模板选项中,选择母版页,点击“添加”
vs已经将一个简单的母版页添加到当前项目中。
对母版页面进行简单修改,最终代码如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!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">
<p>我是母版页内容</p>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
大家注意看代码的蓝色部分。
接下来我们向当前项目中添加web窗体文件:
在当前项目上右键单击>>>添加新项。
在弹出的“添加新项”对话框的模板选项中,选择web窗体,并同时选中“选择母版页”,点击“添加”:
系统接着会弹出“选择母版页”配置框,选择对应项目下的对应母版,单击“确定”:
系统便自动生成内容页,代码经简单修改,代码如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
我是内容页部分。
</asp:Content>
大家注意看代码的蓝色部分。
运行之后,大家会看到:
当我们请求内容页Default.aspx时,系统自动将母版文件内容应用至内容页中,并把最终处理结果展示给我们。asp.net 2.0究竟是怎么实现母版页和内容页之间的整合的呢?下面是一个简单的过程描述:
用户通过内容页的URl请求这个内容页面 >>> 系统获取该内容页后,通过读取@page指令中的MasterPageFile属性获取对应的母版页 >>> 系统将母版页合并到内容页的控件树中。 >>> 系统根据母版页中的"contentplaceholder"控件的ID和内容页Content控件的"ContentPlaceHolderID"属性值,将各个Content控件的内容合并到母版页中相应的ContentPlaceHolder控件中 >>> 系统将合并之后的结果页面发送给客户端。
2、嵌套母版应用
嵌套母版页其实是母版页功能的高级应用,就是在大的母版页中包含一个小的母版页。这里需要注意的是,不管母版页有无嵌套、或者有几个嵌套,整个页面构架中必须至少包含一个内容页,因为母版页本身是不能被用户访问到的。
以下是嵌套母版页应用的简略代码:
大母版页BigMasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MainMasterPage.master.cs" Inherits="MainMasterPage" %>
<!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>大母版页内容</div>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>#p#分页标题#e#
</form>
</body>
</html>
大母版和简单应用时的一样,没有什么变动.
小母版页SmallMasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="SmallMasterPage.master.cs" Inherits="SmallMasterPage" MasterPageFile="~/MainMasterPage.master"%>
<asp:Content ID="SubContent" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
<div>小母版内容</div>
<div>
<asp:contentplaceholder id="ContentPlaceHolder2" runat="server">
</asp:contentplaceholder>
</div>
</asp:Content>
这里看来小母版其实是一个带有母版标记的特殊内容页而已,Content控件之外只允许存在文件头,和部分程序,拒绝存在html代码等.
内容页:Content.aspx:
<%@ Page Language="C#" MasterPageFile="~/SmallMasterPage.master" AutoEventWireup="true" CodeFile="Content.aspx.cs" Inherits="Content" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
内容页内容
</asp:Content>
和简单应用时也一样,不过这里选用的母版是SmallMasterPage.master.
大家着重看蓝色部分哦.运行结果:
3、访问母版页控件及属性
在进行程序设计的时候,我们可能需要在内容页中对母版页进行操控.要访问母版页的的控件或属性有以下几种方法:
一、使用FindControl方法获取母版页控件的引用
利用内容页page对象的Master公共属性,我们可以实现对关联母版页的引用。进而使用母版页的FindControl方法来实现对母版页控件的访问。
母版页MasterPage.master:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage1.master.cs" Inherits="MasterPage1" %>
<!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">
<asp:Label runat="server" ID="masterlabel">母版页的内容</asp:Label>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
内容页Content1.aspx:
<%@ Page Language="C#" MasterPageFile="~/MasterPage1.master" AutoEventWireup="true" CodeFile="content1.aspx.cs" Inherits="content1" Title="Untitled Page" %>
<script runat="server">
void Page_LoadComplete(Object sender, EventArgs e)
{
contentlabel.Text = (Master.FindControl("masterlabel") as Label).Text;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Label ID="contentlabel" runat="server">这里将显示母版页masterlabel控件的内容。</asp:Label>
</asp:Content>
其中,“Page_LoadComplete”是内容页面加载完成时触发的一个事件。
运行结果:
二、使用MasterType指令获取母版页控件的引用
相对于上面的FindControl方法而言,MasterType显得很直接。通过使用MasterType,可以创建与母版页的强类型引用。
将FindControl方法例子中的MasterPage.master更改如下:
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage1.master.cs" Inherits="MasterPage1" %>
<script runat="server">
public Label MasterPageLabel//注意:将母版页label控件强类型化,方便内容页访问。对母版页属性的访问也使用该方法。
{
get#p#分页标题#e#
{
return masterlabel;
}
set
{
masterlabel = value;
}
}
</script>
<!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">
<asp:Label runat="server" ID="masterlabel">母版页的内容</asp:Label>
<div>
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>
</form>
</body>
</html>
将FindControl方法例子中的Content1.aspx更改如下:
<%@ Page Language="C#" MasterPageFile="~/MasterPage1.master" AutoEventWireup="true" CodeFile="content1.aspx.cs" Inherits="content1" Title="Untitled Page" %>
<%@ MasterType VirtualPath="~/MasterPage1.master" %>
<script runat="server">
new void Page_Load(Object sender, EventArgs e)
{
contentlabel.Text = Master.MasterPageLabel.Text;
}
</script>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<asp:Label ID="contentlabel" runat="server">这里将显示母版页masterlabel控件的内容。</asp:Label>
</asp:Content>
4、母版页应用范围配置
以上实例都是页面级母版页应用,只要在对应内容页页面头部声明或设置即可。
如果是程序级母版页应用,应在Web.config中作以下设置:
<configuration>
<system.web>
<pages MasterPageFile="~/MasterPage.master" />
</system.web>
</configuration>
屏蔽某个文件夹使用该母版方案,可以通过在该文件夹下放置不同的web.config文件来实现。
屏蔽某个文件使用该母版方案,可以通过设置.aspx页面头部来实现:
<%@ Page Language="C#" MasterPageFile="~/OtherMasterPage.master" %>
如果不想使用母版,可以把MasterPageFile属性值留空即可。
下节内容:asp.net 2.0新特性:主题和皮肤
尊重作者,请保留 www.it55.com 链接字样。
这一节我们继续一起学习C# 2.0的新特性 匿名方法、迭代器、局部类。
这些新特性可以说是C# 2.0的精华部分之一,利用这些新特性可以很大程度上降低代码重复率和减少代码编写量。
刚才谁扔鸡蛋来着?不就刚刚说了两句废话吗?用得着这样对我吗?好,不说废话,咱们一起开始吧!
1、匿名方法
上节我们讲过委托的用法,大家会感到很麻烦。先是创建一个静态的类或方法,然后声明一个委托并构造。
匿名方法的到来,让大家为之兴奋。先来看个简单的例子:
Button bt;
public void test()
{
bt.Click += delegate {MessageBox.Show("你点击了按钮!");};
}
如果用委托实现就需要这么做:
Button bt;
public void test()
{
bt.Click += new EventHandler(AddClick);//EventHandler其实就是系统类库中的一个委托。
}
.....
void AddClick(object sender, EventArgs e)
{
MessageBox.Show("你点击了按钮!");
}
上面是一个不带参数的匿名方法,如果用带参数的也可以这样实现(要求参数数量和类型要一致):
bt.Click += delegate(object obj, EventArgs er) { MessageBox.Show("你点击了按钮!"); };
匿名方法允许将一段委托关联的代码以代码块的方式内嵌到使用委托的地方,可以省略委托的方法的构造过程。
另外,匿名方法能够共享对本地函数成员的访问:
class Test
{
delegate void D();
static void Main()
{
bool flag = false;
D d = delegate{
if(flag)//读取本地成员flag
Console.WriteLine("True");
else
flag = true;//改写本地成员flag
};
}
}
2、迭代器
为了解释c# 2.0中的迭代器,我们需要先认识一下以下framework中的接口类:
(1)聚合型System.Collections.IEnumerable
(将System.Collections.IEnumerator作为子类建立)
public System.Collections.IEnumerator GetEnumerator()
利用IEnumerable可以产生有序的聚合型对象集合。
(2)枚举型,作用:对聚合型对象集合进行枚举。
System.Collections.IEnumerator
方法:
public object Current
public void Reset()
public bool MoveNext()
下面我们来说说C# 2.0中的迭代器。使用迭代器,我们能够在不实现IEnumerable接口或者IEnumerator接口成员的条件下很方便的实现类、结构体的枚举。
来看一个例子:
//创建方法
public class Test : System.Collections.IEnumerable
{
string[] v = { "a", "b", "c", "d", "e", "f", "g" };//当然,这里也可以是某个类的实体列表
public static System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < v.Length; i++)
{
yield return v[i];
}
}
}
//第一种应用方法
while (Test.GetEnumerator().MoveNext())
{
string obj = (string)ee.Current;
System.Console.WriteLine(obj);
}
//第二种方法:隐式使用
foreach (string obj1 in Test.GetEnumerator())
{
System.Console.WriteLine(obj1);
}
以上程序输出结果(两种应用方法结果相同):
a
b
c
d
e
f
g
3、局部类
在C# 1.X中,我们只允许一个类的内容只能存在在一个文件中,但是如果代码冗长将给我们的阅读和维护工作带来不便。
局部类允许将类、结构、接口的内容分成小块存放于多个文件中,这样不仅避免了上述问题,而且我们还可以在不破坏类的原始完整性的基础上为它添加新的功能或者改善其方法属性。#p#分页标题#e#
局部类必须使用partial关键词创建类。
public partial class Test : IDisposable
{
public string GetStr()
{
return "PartialTest";
}
}
// partial类可以写在不同的文件里,实际上就是取并集,类的修饰符要一致
public partial class Test
{
public int GetInt()
{
return 1;
}
}
public partial class PartialTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Test pt = new Test();
Response.Write(pt.GetStr());
Response.Write(pt.GetInt().ToString());
}
}
局部类型的一些限制:
所谓的局部,仅限于类本身,不支持类内部的方法。
局部类型只适用于类、结构、或接口,不支持委托或枚举。
同一个类型的各个部分必须都有修饰符partial。
使用局部类型时,一个类型的各个部分必须位于相同的名称空间中。
一个类型的各个部分必须被同时编译。
至此,C# 2.0的新特性我们已经总体学完了,下一节我们再次进入Asp.Net 2.0,继续学习Asp.Net 2.0的新特性:母版页
尊重作者,请保留 www.it55.com 链接字样。
C#2.0作为#1.X的升级版本,为我们引入了很多新的而且很实用的特性。最重要的当属泛型(Generics)、匿名方法(Anonymous Methods)、迭代器(Iterators)和局部类(partial Types)。这些新特性在提供高度兼容性的同时,也在很大程度上提高了代码的效率和安全性。
本节我们学习有关于泛型的内容。
泛型存在的必要性:在1.X版本中,为了能适应不同类型的参数引入,我们常常需要重写一些函数,或者常常将其object化,以达到函数的通用性。但往往带给我们的是程序性能的下降和重复性劳动的增加。泛型的出现很好的解决了这个问题。其实简单的讲,泛型是一种可以传递或者灵活规范参数类型的机制。
泛型需要命名空间System.Collections.Generic的支持,可应用于类、方法、结构、接口、委托等设计中,集复用性、类型安全、高效率于一身。下面我们分别举例来看看泛型的几种使用方法。
1、泛型方法
using System;
using System.Collections.Generic;
public class GenericMethod
{
// 静态 泛型方法
public static string Output<T>(T t)
{
return "类型:" + t.GetType().ToString() + ";值:" + t.ToString();
}
}
public partial class Generic_Method : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(GenericMethod.Output<int>(23) + "<br />");
Response.Write(GenericMethod.Output<DateTime>(DateTime.Now) + "<br />");
}
}
2、泛型抽象类
using System;
using System.Collections.Generic;
// 泛型抽象类
public abstract class GenericParent
{
// 泛型抽象方法,返回值为一个泛型,加一个约束使泛型X要继承自泛型Y
public abstract X Output<X, Y>(X x, Y y) where X : Y;
// 泛型抽象方法,返回值为一个string类型,加一个约束使泛型X要继承自IListSource
public abstract string Output2<X>(X x) where X : System.ComponentModel.IListSource;
}
public class GenericChild : GenericParent
{
// 重写抽象类的泛型方法
public override T Output<T, Z>(T t, Z z)
{
return t;
}
// 重写抽象类的泛型方法
public override string Output2<T>(T t)
{
return t.GetType().ToString();
}
}
public partial class Generic_Abstract : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
GenericChild gc = new GenericChild();
Response.Write(gc.Output<string, IComparable>("aaa", "xxx"));
Response.Write("<br />");
Response.Write(gc.Output2<System.Data.DataTable>(new System.Data.DataTable()));
Response.Write("<br />");
}
}
3、泛型接口
using System;
using System.Collections.Generic;
// 泛型接口
public interface IGenericInterface<T>
{
T CreateInstance();
}
// 实现上面泛型接口的泛型类
// 派生约束where T : TI(T要继承自TI)
// 构造函数约束where T : new()(T可以实例化)
public class Factory<T, TI> : IGenericInterface<TI>
where T : TI, new()
{
public TI CreateInstance()
{
return new T();
}
}
public partial class Generic_Interface : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
IGenericInterface<System.ComponentModel.IListSource> factory =
new Factory<System.Data.DataTable, System.ComponentModel.IListSource>();
Response.Write(factory.CreateInstance().GetType().ToString());
Response.Write("<br />");
}
}
4、泛型委托
using System;
using System.Collections.Generic;
public class GenericDelegate
{
// 声明一个泛型委托
public delegate string OutputDelegate<T>(T t);#p#分页标题#e#
// 定义一个静态方法
public static string DelegateFun(string s)
{
return String.Format("Hello, {0}", s);
}
// 定义一个静态方法
public static string DelegateFun(DateTime dt)
{
return String.Format("Time, {0}", dt.ToString());
}
}
public partial class Generic_Delegate : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 使用泛型委托
GenericDelegate.OutputDelegate<string> delegate1
= new GenericDelegate.OutputDelegate<string>(GenericDelegate.DelegateFun);
Response.Write(delegate1("aabbcc"));
Response.Write("<br />");
// 使用泛型委托(匿名方法)
GenericDelegate.OutputDelegate<DateTime> delegate2 = GenericDelegate.DelegateFun;
Response.Write(delegate2(DateTime.Now));
}
}
下一节我们将继续学习C# 2.0的新特性 匿名方法、迭代器、局部类
尊重作者,请保留 www.it55.com 链接字样。
在学习c# 2.0的新特性以前,我们一起来看看c#传统印象里的接口、抽象、委托是怎么一回事。
1、接口包含诸如方法和属性定义等一系列的声明。而这些接口必须有实现接口的类来实现。
定义接口:
[存取权限] interface 接口名称
{
接口体;
}
对接口的存取权限比较常用的有public或internal。
在接口体中定义了各种各样的实现类时必须提供的代码项。接口可以定义方法、属性、索引、事件,但不包括域。
举例:所有车辆的操作都包括“Start”和"Stop",状态只有运行和非运行,我们可以使用Start()和Stop()方法来模型化这些功能,用"started"来表示车辆的运行与否。如:
public interface IDrivable
{
void Start();
void Stop();
bool started
{
get;
}
}
接口只规范started的get属性、车辆的两种操作函数,返回类型void
下面的类来实现这个接口:
public class Car : IDrivable
{
private bool _started = false;
public void Start()
{
_started = true;
}
public void Stop()
{
_started = false;
}
public bool started
{
get
{
_return started;
}
}
}
接下来,程序就可以通过实例化这个Car类来实现对车辆的操作了:
Car myCar = new Car();
myCar.Start();
2、抽象类有下列特点:(此处原文出自互联网,经笔者部分修改,感谢原作者)
声明一个抽象方法使用abstract关键字;
一个类中可以包含一个或多个抽象方法;
抽象类中可以存在非抽象的方法;
抽象类不能被直接被实例化;
实现抽象类用“:”(冒号),实现抽象方法用override关键字;
抽象类可以被抽象类所继承,结果仍是抽象类;
抽象方法被实现后,不能更改修饰符,并且在使用之前必须被重载(override)。
例如:
public abstract class Person
{
public abstract void SayHello();//抽象方法
public void about()//非抽象方法
{
Console.WriteLine("Abstract Demo");
}
}
public class Student : Person
{
public override void SayHello()//抽象方法的重载
{
Console.WriteLine("SayHello");
}
}
class MainClass
{
public static void Main()
{
new Student().SayHello();//使用重载后的类和方法
}
}
3、委托(此处原文出自互联网,写的比我透彻,所以直接引用,感谢原作者)
委托和事件这两个概念是完全配合的。委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成。
委托是一个类,当你对它实例化时,要提供一个引用函数,将其作为它构造函数的参数。
每一个委托都有自己的签名,例如:Delegate int SomeDelegate(string s, bool b);是一个委托申明,在这里,提及的签名,
就是说SomeDelegate 这个委托 有 string 和 bool 类型的形参,返回一个int 类型。
上面提及的:当你对委托实例化时,要提供一个引用函数,将其作为它构造函数的参数。
这里要注意了:被引用的这个函数必须和委托有相同的签名。
看下面的函数:
private int SomeFunction(string str, bool bln){...}
你可以把这个函数传给SomeDelegate的构造函数,因为他们有相似的签名(in other words,他们都有相同的形参类型和个数,并且返回相同的数据类型)。
SomeDelegate sd = new SomeDelegate(SomeFunction);
sd 引用了 SomeFunction,也就是说,SomeFunction已被sd所登记注册,如果你调用 sd,SomeFunction 这个函数也会被调用,
记住:我所说 SomeFunction的含义,后面,我们会用到它。
委托类似于函数指针,它既能引用静态(static)方法,也能引用实例方法。
委托使用分三步:1、委托声明。2、委托实例化。3、委托调用。
例:
using System;
namespace 委托
{
delegate int NumOpe(int a,int b); //委托声明
class Class1
{
static void Main(string[] args)
{
Class1 c1 = new Class1();#p#分页标题#e#
NumOpe p1 = new NumOpe(c1.Add); //委托实例化
Console.WriteLine(p1(1,2)); //委托调用
Console.ReadLine();
}
private int Add(int num1,int num2)
{
return(num1+num2);
}
}
}
例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。
委托和所引用的方法必须保持一致:参数个数、类型、顺序必须完全一致;返回值必须一致。
下一节我们会在本节基础上分析学习:c# 2.0新特性 泛型
尊重作者,请保留 www.it55.com 链接字样。
c#中的类是一种数据结构,一般成员包括:数据成员、函数成员、嵌套类型等。
声明语法: [属性 类修饰] class 类名称 : [基类规范] 中括弧中的元素为可选元素.
例如: public partial class _Default : System.Web.UI.Page
类修饰符包括:
new:适用于嵌套类,被修饰的类会把继承下来的同名成员隐藏.
public:存取不受限制.
private:只有包含该成员的类可以存取.
internal:只有当前工程可以存取.
protected:只有包含该成员的类以及继承的类可以存取.
abstract:可以被指示一个类只能作为其它类的基类.
sealed:指示一个类不能被继承.
abstract:指示该方法或属性没有实现.
const:指定域或局部变量的值不能被改动.
event:声明一个事件.
extern:指示方法在外部实现.
override:对由基类继承成员的新实现.
readonly:指示一个域只能在声明时以及相同类的内部被赋值.
static:指示一个成员属于类型本身,而不是属于特定的对象.
virtual:指示一个方法或存取器的实现可以在继承类中被覆盖.
c#中的属性是一种用于访问对象或类的特性的成员.其具有访问器,并可在访问时进行控制.
语法:
string tempStr = "itgao.com";
public string Name
{
get
{
return tempStr;
}
set
{
tempStr = value;
}
}
当Name变量被读取时,执行get;当Name变量被赋值时,执行set;另:set和get中可以写入自己的控制函数.
C#中的方法其实是一个功能块,语法如下:
[属性 类修饰] 返回值类型 函数名称(传递参数列表){功能程序块}
例如:
public string GetName(bool flag)
{
if(flag)
return "itgao.com is good";
else
return "itgao.com is alse good,haha";
}
C#的基础知识教程网上比较多,这里只介绍本人觉得是重点地东西。如果有需要你可以来 www.it55.com 搜索更多.net方面的教程。
下篇即将学习:c#中的接口、抽象、委托
尊重作者,请保留 www.it55.com 链接字样。
前几节我们讲述了如何安装vs2005编程环境,如何创建、编写、编译、部署自己的asp.net 2.0 web应用程序。今天我们来揭开asp.net应用程序的主要开发语言:c#语言 的神秘面纱。
本节重点讲述c#的常用语句。
引用微软的话:“c#是一种源自于c和c++语言之上的、简单的、现代的和类型安全的面向对象的编程语言。c#的目的就是综合Visual Basic的高程产率和c++的灵活性。”其实,c#就是这样一种编程语言,它使开发人员能快速创建基于.NET平台的应用程序。冠冕堂皇的话权且不说,先看看c#的数值类型。
1、值类型。
值类型包括整数类型(又包括短字节型、字节型、短整型、无符号短整型、整型等等,不再累述)、布尔类型(true和false)、字符类型(包括数字字符、英文字符、表达符号等)、实数类型(浮点类型和十进制类型)、结构类型、枚举类型
2、引用类型。
引用类型包括类类型、对象类型、字符串类型、接口类型、数组类型、委托类型。
以上诸多类型理解起来比较乏味,这里不再一一讲述,有兴趣的朋友可以自己去google或者baidu里搜搜。
c#中主要的流程控制语句:
一、条件语句:
1、if语句
if(条件)
{
执行语句;
}
或者
if(条件)
{
执行语句1;
}
else
{
执行语句2;
}
条件语句可以互相嵌套。
2、switch语句
switch(参考变量)
{
case 值1:
执行语句1;
break;
case 值2:
执行语句2;
break;
...
default://默认值设置
如果上面的值都不符合参考变量,执行这里的语句;
break;
}
二、循环语句
1、for语句
for(int i=0;i<10;i++)
{
执行语句;
}
上述for语句运行机制:初始化 声明整形变量i=0,判断i<10是否成立,如果成立则继续执行语句,如果不成立则退出循环,如果成立执行语句,然后i自增加1,再判断i<10是否成立,如果成立则继续执行语句,如果不成立则退出循环。
2、foreach语句
foreach(元素类型 元素 in 元素集合)
{
对元素的操作执行语句;
}
foreach语句是对元素集合中的各个元素进行遍历并操作的语句。
3、while语句
while(条件)
{
执行语句;
}
只要条件为真,执行语句将反复执行。除非程序介入跳出。
4、do-while语句
do
{
执行语句;
}
while(条件)
do-while语句和while语句唯一不同的就是:do-while是先执行后判断执行条件;while语句是先判断后执行。
三、跳转语句
1、goto语句
例如:
label1:
执行语句或函数;
...
goto label1;
在程序的某个部位定义一个标记,当程序需要的时候直接通过goto语句跳到该标签处,并从该标签处向下执行。
2、return语句
return语句的作用是直接跳出所在函数,并可能返回一个值。
如:
return "返回值";
3、break语句
break的使用很简单:
break;
作用:直接跳出所属循环语句或者函数。
4、continue语句
使用方法:
continue;
作用:跳出当前一轮循环,进入下一轮循环。
下面举例说明break和continue的不同。
for(int i=0 ; i < 6; i++)
{
if(i == 2)
continue;
if(i>4)
break;
Console.WriteLine(i);
}
程序运行的结果是:0 1 3 4
当i等于2时,执行continue,跳出当前一轮循环,继续执行i++、并进入下一轮循环。
当i等于5时,执行break,跳出for循环,即for循环结束。
四、异常处理
语句示例:
try
{
执行可能发生异常的语句;
}
catch(捕捉异常类型)
{
输出异常信息或者进行第二套执行方案语句;//当程序捕捉到异常时才执行。
}
finally
{
执行异常处理的最终处理,通常作释放资源用;//这里的语句不管有没有发生异常,都会执行。
}
下篇进一步学习:c#中的类、属性、方法
尊重作者,请保留 www.it55.com 链接字样。
上节我们创建了第一个asp.net 2.0应用程序。应用程序创建完毕后,vs自动生成了一个Default.aspx的页面。
下面我们就用这个Default.aspx页面来开始我们的asp.net开发之旅吧。
先将Default.asp切换至设计视窗(页面下方点击“设计”),
把工具箱里的TextBox拖拉至页面中,
并通过右键“属性”菜单将其ID改为input,
同样操作,我们拖进来一个按钮,并将其ID命名为btOk,将其Text值改为“确认”,
双击“确定”按钮,vs为我们打开了Default.aspx的后台程序文件Default.aspx.cs,
我们可以看到有个Page_Load函数,它是处理页面加载事件的;另外一个是btOk_Click事件,这个就是我们的“确认”按钮的点击事件触发的事件处理函数了。
在这个函数里我们可以写上我们需要的语句来达到我们程序的要求,例如我们写上:Response.Write(input.Text); 作用是将我们写在input中的字符串输出到前台页面上。
好了,我们的第一个程序写完了,现在用Ctr+Shift+B来对程序进行编译,然后通过F5键来运行查看效果。(或者直接通过“调试”菜单中的“开始执行(不调试)”直接运行察看)
如果没有意外我们会顺利看到下面的页面:

在文本框中输入“www.itgao.com 在线教程”,然后点击“确定”按钮,看看会有什么效果呢:
页面把我们输入的内容直接输出到页面上了:)
程序做好了,怎么发布出去呢?这就是asp.net应用程序部署功能。应用程序的部署有两种方法:
1、复制网站:通过vs中“网站”菜单中的“复制网站”功能将程序复制到目标服务器,如下图:
这种方法是单纯的文件复制过程。
2、发布网站:通过vs中“生成”菜单中的“发布网站”功能将程序进行编译,并将编译后的文件复制到目标服务器,如下图:
我们的第一个asp.net2.0应用程序的创建、编写、编译、部署过程到这里就全部完成了。
那么asp.net中我们使用的C#语言有哪些常用的语句、函数、数据类型呢?又遵循怎样的规则?我们会在下面的章节里和大家一起学习这些知识。
尊重作者,请保留 www.it55.com 链接字样。
启动vs2005,单击“文件”菜单中的“新建网站...”,如图:
弹出“新建网站”对话框: 
通过这个对话框你可以设置新建网站类型、网站模版、网站存储位置及使用的语言等。这里我们创建一个普通的net站点,所以选择“Asp.Net网站”,然后选择站点的存储路径,这里出现四种路径方案:文件系统、本地iis、ftp站点、远程站点,四种方案各有利弊,这里根据自己的需要选择其一,并填写相应设置。

这里我们利用文件系统来建立我们的站点,选择好位置后点击“打开”,最后“确定”。站点中vs将自动生成一个默认首页文件Default.aspx及一个App_Data文件夹(用于存放应用程序的数据文件)。
至此,我们的第一个asp.net 2.0网站创建成功。下一节我们将讲述“asp.net 2.0程序的编写及编译”。
|