6.1 登录控件

  对于目前常用的网站系统而言,登录功能是必不可少的,例如论坛、电子邮箱、在线购物等。登录功能能够让网站准确的验证用户的身份。用户能够访问该网站时,可以注册并登录,登录后的用户还能够注销登录状态以保证用户资料的安全性。ASP.NET就提供了一系列的登录控件方便登录功能的开发。

6.1.1 登录控件(Login)
  登录控件是一个复合控件,它包含用户名和密码文本框,以及一个询问用户是否希望在下一次访问该页面时记起其身份的复选框。当用户勾选此选项时,下一次用户访问此网站后,将自动进行身份验证。创建一个登录控件代码,系统会自动生成相应的HTML代码,示例代码如下所示。
+展开
-HTML
        <asp:Login ID="Login1" runat="server">
        </asp:Login>

  上述代码则创建了一个登录控件,如图6-1所示。开发人员可以通过属性的设置更改登录控件的样式等,如图6-2所示。
默认登录窗口
图6-1 默认登录窗口
登录框属性的设置
图6-2 登录框属性的设置
  开发人员能够使用登录控件执行用户登录操作而无需复杂的代码实现,登录控件常用的属性如下所示。
?★Orientation:控件的一般布局。
?★TextLayout:标签相对于文本框的布局。
?★CreatUserIconUrl:用户创建用户连接的图标的URL。
?★CreatUserText:为“创建用户”连接显示的文本。
?★CreatUserUrl:创建用户页的URL。
?★HelpPageIconUrl:用于帮助页连接的图标的URL。
?★HelpPageText:为帮助连接显示的文本。
?★HelpPageUrl:帮助页的URL。
?★PasswordRecoveryIconUrl:用于密码回复连接的图标的URL。
?★PasswordRecoveryUrl:为密码回复连接显示的文本。
?★PasswordRecoveryText:密码回复页的URL。
?★MembershipProvider:成员资格提供程序的名称。
?★FailuteText:当登录尝试失败时显示的文本。
?★InstructionText:为给出说明所显示的文本。
?★LoginButtonImageUrl:为“登录”按钮显示的图像的URL。
?★LoginButtonText:为“登录”按钮显示的文本。
?★LoginButtonType:“登录”按钮的类型。
?★PasswordLableText:密码标识文本框内的文本。
?★RememberMeText:为“记住我”复选框所显示的文本。
?★TitleText:为标题显示的文本。
?★UserName:用户名文本框内的初始值。
?★UserNameLableText:标识用户名文本框的文本。
?★DestinationPageUrl:用户成功登录时被定向到的URL。
?★DisplayRememberMe:是否显示“记住我”复选框。
?★Enabled:控件是否处于启动状态。
?★RememberMeSet:“记住我”复选框是否初始化被选中。
?★VisibleWhenLoggedIn:是否控件在用户登录时保持可见。
?★PasswordRequiredErrorMessage:密码为空时在验证摘要中显示的文本。
?★UserNameRequiredErrorMessage:用户名为空时在验证摘要中显示的文本。
  同样,登录控件还包括许多常用的事件,登录控件常用的事件如下所示:
?★Authenticate:当用户使用登录控件登录到网站时,引发该事件。
?★LoggedIn:对用户进行身份验证后引发该事件。
?★LoggingIn:对用户进行身份验证前引发该事件。
?★LoginError:对用户进行用户身份验证失败时引发该事件。
  开发人员能够在页面中拖动相应的登录控件实现登录操作,使用登录控件进行登录操作可以直接进行用户的信息的查询而无需复杂的登录实现。

6.1.2 登录名称控件(LoginName)
  登录名称控件(LoginName)是一个用来显示已经成功登录的用户的控件。在Web应用程序开发中,开发人员常常需要在页面中通知相应的用户已经登录,如用户在商品网站上进行登录,登录成功后可以在相应的页面中提示“您已登录,您的用户名是XXX”等,这样不仅能够提高用户的友好度,也能够让开发人员在Web应用程序中方便的对用户信息做收集整理。

  开发人员能够方便的在应用程序中拖动LoginName控件用于用户名的呈现,拖动到页面中,系统生成的HTML代码如下所示。
+展开
-HTML
        <asp:LoginName ID="LoginName1" runat="server" />

  上述代码则实现了一个登录名称控件,开发人员能够将该控件放置在页面中的任何位置进行页面呈现,当用户登录后,该控件能够获取用户的相应信息并呈现用户名在控件中。登录控件页面效果如图6-3所示。
登录名称控件
图6-3 登录名称控件
注意:LoginName控件只能够在<body>标记内的<form>标记中使用,该控件不能够使用于<title>、<style>等标记中。

  在LoginName控件中,最常用的属性为FormatString属性,该属性用于格式化用户名输出。在控件的FormatString属性中,“{0}”字符串用于显式用户名,开发人员能够配置相应的字符串进行输出,例如配置成“您好,{0},您已经登录!”,可以在相应的占位符中呈现相应的用户名,如图6-4所示。
格式化输出用户名
图6-4 格式化输出用户名
  正如图6-4所示,当对LoginName进行格式化规定后,用户名能够被格式化输出,例如当用户soundbbg登录在Web应用后,该控件会呈现“您好,soundbbg,您已登录!”。开发人员只需要通过简单的配置就能够实现复杂的登录显示功能操作的实现。

6.1.3 登录视图控件(LoginView)
  在应用程序的开发过程中,通常需要对不同的身份和权限的用户进行不同登录样式的呈现,开发人员可以为用户配置内置对象以呈现不同的页面效果。但是在页面请求时,还需要对用户的身份进行验证。在ASP.NET 2.0之后的版本中,系统提供了LoginView控件用于不同用户权限之间的视图的区分。

  在开发一个应用程序时,开发人员希望应用程序能够实现功能当用户在网站中没有登录时,用户看到的视图是没有登录时的视图,包括网站的风格、系统的提示信息等。而当用户登录后,用户看到的视图是登录后的视图,同样包括网站的风格、系统的提示信息等。LoginView控件为开发人员提供了不同权限的用户进行不同视图的查看的功能,开发人员能够拖动LoginView控件在页面中以编辑不同的页面进行开发。

  拖动一个LoginView控件在页面中,开发人员能够通过编辑不同的模板进行不同权限的页面的编写,拖动LoginView控件后系统生成的HTML代码如下所示。
+展开
-HTML
        <asp:LoginView ID="LoginView1" runat="server">
        </asp:LoginView>

  上述代码为默认的LoginView控件的代码,开发人员需要通过编写相应的模板以便不同的用户查看不同的页面,在LoginView控件中,包括两个最常用的模板,这两个模板及其作用分别如下所示。

?1)AnonymousTemplate:匿名模板,当用户没有进行登录时,该模板会呈现在匿名用户面前。
?2)LoggedInTemplate:已登录模板,当用户已经登录成功后,该模板会呈现在已经登录的用户面前。
  开发人员可以通过编写相应的模板进行页面的呈现,当用户没有登录时,用户可以看见AnonymousTemplate模板中的内容而无法看见LoggedInTemplate模板的内容;而如果用户已经登录,则登录过后的用户能够看见LoggedInTemplate模板的内容而无法看见AnonymousTemplate模板的内容,如图6-5所示。
LoginView控件
图6-5 LoginView控件

  在AnonymousTemplate模板中,该模板通过获取和判断PageUser属性的Name属性进行判断。如果PageUser属性的Name属性为空时,AnonymousTemplate模板则不会向通过身份验证的用户的呈现相应的页面。开发人员可以通过编写AnonymousTemplate模板和LoggedInTemplate模板进行不同用户的样式呈现,示例代码如下所示。
+展开
-HTML
<body>
    <form id="form1" runat="server">
    <div>
        <asp:LoginView ID="LoginView1" runat="server">
            <LoggedInTemplate>
                这是一个登录用户可以访问的页面..
            </LoggedInTemplate>
            <AnonymousTemplate>
                这是一个匿名用户可以访问的页面..
            </AnonymousTemplate>
        </asp:LoginView>   
    </div>
    </form>
</body>

  上述代码为不同权限的用户配置了不同的模板,当不同权限的用户访问页面时,其看到的页面样式也是不同的。在LoginView控件中,还能够为不同权限和身份的用户配置不同的模板,开发人员能够为不同的用户分配不同的角色。当用户被分配了不同的角色后,用户能够通过相应的角色访问相应的模板,例如普通用户可以访问普通用户模板,VIP用户可以访问VIP模板而管理员可以访问管理员模板。

  在LoginView控件中,单击RoleGroup集合,可以添加相应的LoginView控件的RoleGroup集合,如图6-6所示。
添加RoleGroup集合
图6-6 添加RoleGroup集合

  这里添加了两个RoleGroup集合,该RoleGroup集合分别包含admin和VIP两种用户类别,当用户为admin或VIP是,可以通过相应的权限绑定进行不同模板的访问,创建后示例代码如下所示。
+展开
-HTML
        <asp:LoginView ID="LoginView1" runat="server">
            <RoleGroups>
                <asp:RoleGroup Roles="admin">
                    <ContentTemplate>
                        这是一个管理员用户可以访问的页面..
                    </ContentTemplate>
                </asp:RoleGroup>
                <asp:RoleGroup Roles="vip">
                    <ContentTemplate>
                        这是一个VIP用户可以访问的页面
                    </ContentTemplate>
                </asp:RoleGroup>
            </RoleGroups>
            <LoggedInTemplate>
                这是一个登录用户可以访问的页面..
            </LoggedInTemplate>
            <AnonymousTemplate>
                这是一个匿名用户可以访问的页面..
            </AnonymousTemplate>
        </asp:LoginView>

  当有不同身份的用户访问该控件时,控件能够通过用户的身份进行不同模板的呈现,这样就方便了开发人员对不同身份和权限的用户进行网站应用程序和模板的访问限制了。

注意:当一个用户拥有的身份或权限不在列表的权限中时,该用户会默认访问LoggedInTemplate模板,并且无论是LoggedInTemplate模板还是RoleGroup模板,都不会对匿名用户呈现。

6.1.4 登录状态控件(LoginStatus)
  登录状态控件(LoginStatus)用于显式用户验证时的状态,LoginStatus包括“登录”和“注销”两种状态,对于LoginStatus控件的状态是由相应的Page对象的Request属性中的IsAuthenticated属性进行决定。开发人员能够直接将LoginStatus控件拖放在页面中,从而让用户能够通过相应的状态进行登录或注销操作,LoginStatus控件默认HTML代码如下所示。
+展开
-HTML
        <asp:LoginStatus ID="LoginStatus1" runat="server" />

  上述代码就呈现了一个LoginStatus控件,LoginStatus控件默认的呈现形式是以文本的形式呈现的,如图6-7所示。
LoginStatus控件呈现形式
图6-7 LoginStatus控件呈现形式

  正如图6-7所示,LoginStatus控件默认的呈现形式是以文本的形式呈现的。当用户没有在网站上进行登录操作时,该控件会呈现登录字样给用户以便用户进行登录操作,当用户登录后,LoginStatus控件会为用户提供注销字样以便用户进行注销操作。开发人员还能够为LoginStatus控件指定以图片形式进行登录和注销,LoginStatus控件常用的属性如下所示。
?1)LoginImageUrl:设置或获取用于登录连接的图像URL。
?2)LoginText:设置或获取用于登录连接的文本。
?3)LogoutAction:设置或获取一个值用于用户从网站注销时执行的操作。
?4)LogoutImageUrl:设置或获取一个值用于登出图片的显示。
?5)LogoutPageUrl:设置或获取一个值用于登出连接的图像URL。
?6)LougoutText:设置或一个值用于登出连接的文本。
?7)TagKey:获取LoginStatus控件的HtmlTextWriterTag的值。
  开发人员可以配置LoginImageUrl以及LogoutImageUrl属性进行登录、登出的图片显示,使用图片进行登录登出操作能够提高用户体验,示例代码如下所示。
+展开
-HTML
<body>
    <form id="form1" runat="server">
    <div>
        <asp:LoginStatus ID="LoginStatus1" runat="server" LoginImageUrl="~/login.jpg" 
            LogoutImageUrl="~/logout.jpg" />

    </div>
    </form>
</body>

  上述代码指定了当用户没有登录时,相应的登录操作以图片的形式呈现在页面中,同样当用户登录后,注销操作也会以图片的形式呈现在页面中,如图6-8所示。
图片形式呈现
图6-8 图片形式呈现

  LoginStatus控件还包括两个常用事件,这两个事件分别为LoggingOut和LoggedOut。当用户单击注销按钮时会触发LoggingOut事件,开发人员能够在LoggingOut事件中编写相应的事件以清除用户的身份信息,这些信息包括Session、Cookie等。开发人员还能够在LoggedOut事件中规定在用户离开网站时所必须执行的操作。

6.1.5 密码恢复控件(PasswordRecovery)
  当用户进行Web应用程序访问时,在有些情况下会丢失用户密码,这样就需要通过Web应用程序恢复自己的密码。在应用程序开发中,为了提高系统的安全性和用户信息的私密性,开发人员常常需要编写诸多代码来保存用户的信息并进行用户请求的检测。ASP.NET中提供了密码恢复控件以便开发人员能够在Web应用中轻松的能够让用户自行进行密码回复。

  开发人员能够拖动一个PasswordRecovery控件在页面中,系统能够在主窗口中创建一个PasswordRecovery控件所必须的声明,示例代码如下所示。
+展开
-HTML
        <asp:PasswordRecovery ID="PasswordRecovery1" runat="server">
        </asp:PasswordRecovery>

  开发人员能够使用PasswordRecovery控件进行相应的配置,包括自动太用格式、视图配置、转换成模板以及网站管理等,如图6-9所示。

  对于PasswordRecovery控件而言,开发人员能够单击PasswordRecovery控件的属性进行相应的配置,例如选择自动套用格式,单击【自动套用格式】按钮进行格式的选取,如图6-10所示。
默认的PasswordRecovery控件
图6-9 默认的PasswordRecovery控件
选择默认格式
图6-10 选择默认格式

  开发人员可以选择自动套用格式进行模板的编写,以提高用户体验,开发人员还能够自行编写模板进行PasswordRecovery控件的样式控制,选择相应的样式后,系统会自行生成样式控制代码,示例代码如下所示。
+展开
-HTML
        <asp:PasswordRecovery ID="PasswordRecovery1" runat="server" BackColor="#F7F7DE" 
            BorderColor="#CCCC99" BorderStyle="Solid" BorderWidth="1px" 
            Font-Names="Verdana" Font-Size="10pt">

            <TitleTextStyle BackColor="#6B696B" Font-Bold="True" ForeColor="#FFFFFF" />
        </asp:PasswordRecovery>

  开发人员能够通过修改上面的颜色进行样式控制。在PasswordRecovery控件中,除了能够自动套用和开发PasswordRecovery控件的格式外,开发人员还能够为PasswordRecovery控件相应的功能进行样式控制。PasswordRecovery控件包括三个基本功能,分别为【用户名】、【密码提示问题】和【成功模板】。

  在用户使用PasswordRecovery控件进行密码恢复时,首先需要输入用户名进行用户名的匹配。如果用户名匹配后PasswordRecovery控件要求用户进行问题答案的填写。如果答案正确,PasswordRecovery控件能够为用户显示【成功模板】。

  开发人员能还够分别为三个功能进行模板创建。在默认情况下,开发人员不能够进行模板的编辑,开发人员可以选择PasswordRecovery控件中【管理】菜单中的【转换为模板】选项进行相应的模板转换,如图6-11所示。
 转换为模板
图6-11 转换为模板

  当转换为模板之后,开发人员就能够在模板中编写相应的文档或样式控制提高用户体验的友好度。在编写相应的模板后,该控件中的三个功能会分别被生成为模板形式而存在,示例代码如下所示。
+展开
-HTML
<QuestionTemplate>
    <table border="0" cellpadding="1" cellspacing="0" style="border-collapse: collapse;">
        <tr>
        <td>
            <table border="0" cellpadding="0">
        <tr>
            <td align="center" colspan="2" style="color: White; background-color: #6B696B; font-weight: bold;">
            标识确认</td>
        </tr>
        <tr>
            <td align="center" colspan="2">要接收您的密码,请回答下列问题。只有当填写了相应的问题后, 
            您的用户密码才能够被恢复</td>
        </tr>
        <tr>
            <td align="right">用户名:</td>
            <td>
            <asp:Literal ID="UserName" runat="server"></asp:Literal>
            </td>
        </tr>
        <tr>
            <td align="right">问题:</td>
            <td>
            <asp:Literal ID="Question" runat="server"></asp:Literal>
            </td>
        </tr>
        <tr>
            <td align="right">
            <asp:Label ID="AnswerLabel" runat="server" AssociatedControlID="Answer">答案:</asp:Label>
            </td>
            <td>
            <asp:TextBox ID="Answer" runat="server"></asp:TextBox>
            <asp:RequiredFieldValidator ID="AnswerRequired" runat="server" 
            ControlToValidate="Answer" ErrorMessage="需要答案。" 
            ToolTip="需要答案。" ValidationGroup="PasswordRecovery1">
*</asp:RequiredFieldValidator>
            </td>
        </tr>
        <tr>
            <td align="center" colspan="2" style="color: Red;">
            <asp:Literal ID="FailureText" runat="server" EnableViewState="False"></asp:Literal>
            </td>
        </tr>
        <tr>
            <td align="right" colspan="2">
            <asp:Button id="SubmitButton" runat="server" commandname="Submit" 
            text="提交" validationgroup="PasswordRecovery1" />

            </td>
        </tr>
            </table>
            </td>
        </tr>
    </table>
</QuestionTemplate>

  上述代码实现了【提问模板】中的模板信息和样式,当用户进入提问功能时会呈现该模板。当用户输入用户名时,系统会查找相应的用户信息并跳转到提问页面。如果用户回答自己提问的问题并回答正确后,PasswordRecovery控件会将密码发送到相应的邮箱中,而如果用户回答出错,PasswordRecovery控件就保留密码,以提高系统的安全性。

6.1.6 密码更改控件(ChangePassword)
  在应用程序开发中,开发人员需要编写密码更改控件让用户能够快速的进行密码更改。在应用程序的使用中,用户会经常需要更改密码,更改密码有很多的可能性。例如用户进行登录后发现自己的用户信息可能被其他人改动过,就有可能怀疑密码泄露的问题,这样用户就可以通过更改密码进行密码的更换。另外,如果用户在注册时的密码是系统自动生成的密码,用户同样需要在密码更改控件中修改生成的密码以便用户记忆。

  在ASP.NET中提供了密码更改控件以便开发人员能够轻易的完成密码更改功能。拖放一个密码更改控件在页面,系统会自动生成相应的HTML代码,示例代码如下所示。
+展开
-HTML
        <asp:ChangePassword ID="ChangePassword1" runat="server">
        </asp:ChangePassword>

  ChangePassword控件包括密码、新密码和确认新密码,如图6-12所示。
ChangePassword控件
图6-12 ChangePassword控件

  当用户需要更改密码时,用户必须先填写旧密码进行密码的验证,如果用户填写的旧密码是正确的密码,则系统会将新密码替换旧密码以便用户下次登录时使用新密码。如果用户填写的旧密码不正确,则系统会认为可能是一个非法用户而不允许更改密码。ChangePassword控件同样允许开发人员自动套用格式或者通过编写模板进行ChangePassword控件的样式布局,如图6-13所示。
自动套用格式
图6-13 自动套用格式

  开发人员能够自动套用格式进行更改密码控件的呈现,不仅如此,开发人员还能够单击右侧的功能导航进行模板的转换,转换成模板后开发人员就能够进行模板的自定义。ChangePassword控件可以使用Web.config中的membership配置节进行成员资格配置,所以ChangePassword控件能够实现不同场景的不同功能,这些功能如下所示。
?1)用户登录情况:开发人员能够使用ChangePassword控件允许用户在不登录的情况下进行密码的更改。
?2)更改用户密码:开发人员能够使用ChangePassword控件让一个登录的用户进行另一个用户的密码的更改。

  在ChangePassword控件中,开发人员可以通过配置ChangePassword控件的相应属性进行ChangePassword控件的样式或者是功能的设置,这样能够保证在一定的安全范围内进行安全的用户信息操作。ChangePassword控件常用的属性如下所示。
?1)CancelButtonImageUrl:配置取消按钮控件的图片文本,该属性可以为按钮控件指定一个图片按钮进行呈现。
?2)CancelButtonStyle:配置取消按钮控件的样式和外观的属性集。
?3)ChangePasswordButtonType:配置更改密码控件的类型。
?4)ChangePasswordFailtureText:配置更改密码失败时所呈现的错误信息。
?5)ConfirmNewPassword:获取用户输入的重复密码的值。
?6)ConfirmPasswordCompareErrorMessage:当用户输入密码和输入验证密码出现错误时提示的错误消息。
?7)ConfimPasswordRequiredErrorMessage:当用户没有输入“确认新密码”时在控件中提示的错误消息。
?8)ContinueButtonImageUrl:为继续按钮配置一个图片文本,该属性可以为按钮控件指定一个图片按钮进行呈现。
?9)ContinueButtonStyle:为继续按钮配置样式或属性集。

  开发人员能够配置相应的ChangePassword控件的属性进行不同的ChangePassword控件的样式呈现,以及功能实现。在ChangePassword控件中,有许多属性都是包括按钮或表格的样式的呈现的属性,这里就不再一一列举。

6.1.7 生成用户控件(CreateUserWizard)
  生成用户控件(CreateUserWizard)为MembershipProvider对象提供了用户界面,使用该控件能够方便的让开发人员在页面中生成相应的用户,同时当用户访问该应用程序时,用户能够通过使用CreateUserWizard控件的相应的功能进行注册,如图6-14所示。
CreateUserWizard控件
图6-14 CreateUserWizard控件

  正如图6-14所示,CreateUserWizard控件默认包括多个文本框控件以便用户的输入,这里包括用户名、密码、确认密码、电子邮件、安全提示问题和问题答案等项目。其中用户名、密码、确认密码用于身份验证和数据插入为系统提供用户信息,而电子邮件和安全答案用于当用户忘记密码或更改密码时向用户发送相应的邮件以便提高系统身份认证的安全性。

  开发人员能够将CreateUserWizard控件拖放在主窗口中进行页面呈现,这样就能够实现用户注册功能,当开发人员拖动CreateUserWizard在主窗口中是,系统会自动生成HTML代码,示例代码如下所示。
+展开
-HTML
        <asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
            <WizardSteps>
                <asp:CreateUserWizardStep runat="server" />
                <asp:CompleteWizardStep runat="server" />
            </WizardSteps>
        </asp:CreateUserWizard>

  上述代码创建了一个CreateUserWizard控件进行用户注册功能的实现,开发人员还能够为CreateUserWizard控件中相应的模板进行样式控制。例如当用户注册完毕后,用户会跳转到一个页面提示“账户注册完毕,请登录”等等,这样就能提高用户体验。单击【自定义完成步骤】按钮或在快捷窗口下拉菜单中选择【完成】选项就能够进行完成模板的实现,如图6-15所示。
完成模板的编写
图6-15 完成模板的编写

  开发人员能够在完成步骤中编辑模板以便能够进行更多的提示和更好的用户体验,编辑完成模板后,系统会自动更改相应的代码,示例代码如下所示。
+展开
-HTML
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" ActiveStepIndex="1">
    <WizardSteps>
        <asp:CreateUserWizardStep runat="server" />
        <asp:CompleteWizardStep runat="server">
        <ContentTemplate>
            <table border="0">
                <tr>
                    <td align="center">恭喜您!注册完毕!</td>
                </tr>
                <tr>
                    <td>已成功创建您的账户,请登录。</td>
                </tr>
                <tr>
                    <td align="right">
                    <asp:Button ID="ContinueButton" runat="server" CausesValidation="False" 
                    CommandName="Continue" Text="继续" ValidationGroup="CreateUserWizard1" />

                    </td>
                </tr>
            </table>
        </ContentTemplate>
        </asp:CompleteWizardStep>
    </WizardSteps>
</asp:CreateUserWizard>

  上述代码创建了一个完成注册的模板,开发人员还可以通过编写自定义创建用户模板以便更加方便的创建用户。CreateUserWizard控件还包括其他模板,这些模板能够方便开发人员进行更高的页面呈现,这些模板及其说明如下所示。
?1)HeadTemplate:获取或设置标题区的模板内容。
?2)SideBarTemplate:获取或设置侧边栏的模板内容。
?3)StartNavigationTemplate:获取或设置起始步骤中导航区域的模板内容。
?4)StepNavigationTemplate:获取或设置不同步骤中导航区域的模板内容。
?5)FinishNavigationTemplate:获取或设置结束步骤中导航区域的模板内容。
?6)ContentTemplate:获取或设置在创建用户模板和完成模板中的模板内容。
  开发人员还能够通过HeadTemplate、SideBarTemplate等模板进行高级的CreateUserWizard控件的页面呈现和样式控制,这样不仅能够提高用户体验和友好度,还能够清晰的让用户按照步骤执行操作,降低了错误的出现率。

加支付宝好友偷能量挖...


评论(0)网络
阅读(89)喜欢(0)Asp.Net/C#/WCF