65.9K
CodeProject 正在变化。 阅读更多。
Home

已完全配置的 ASP.NET Membership 网站模板

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (17投票s)

2009年6月26日

CPOL

4分钟阅读

viewsIcon

170335

downloadIcon

8366

一个预配置的 ASP.NET 网站,包含一个母版页、错误处理、登录/注销以及其他样板化新项目代码。

介绍 

附带的 Visual Studio 模板可用于即时创建网站项目,其中包含开发中通常繁琐的所有样板化代码(登录/注销、显示消息、母版页、CSS、JavaScript、错误处理、更改密码等……)。本文提供了一个完全配置的起点,用于网站项目开发,所有这些样板化代码都已完成。

背景

应用程序的起点通常需要最长时间来正确配置应用程序以统一显示消息,或者使登录功能正常工作。为了加快应用程序开发过程的这一部分,我构建了这个应用程序模板,供 Visual Studio 2008 使用,为所有进一步的网站开发提供了一个垫脚石。

如果您不了解 Visual Studio 项目和项模板,请先在此处 浏览 以了解概览,然后再继续。如果您不了解基类页及其用途,请先在此处 浏览 以了解概览,然后再继续。如果您不了解母版页及其用途,请先在此处 浏览 以了解概览,然后再继续。

使用代码

将附带的 .zip 文件放入与 Visual Studio 2008 关联的“项目模板”文件夹中。默认位置是 {驱动器}:\...\Documents\Visual Studio 2008\Templates\ProjectTemplates。如果您不知道您的位置,请打开 Visual Studio -> 工具 -> 选项 -> 项目和解决方案,然后查看“用户项目模板位置”文本框,以了解 Visual Studio 在何处查找自定义项目模板。

.zip 文件放入“项目模板”文件夹后,打开 Visual Studio 2008,然后单击“文件”->“新建”网站。为您的网站命名,然后单击“确定”。解决方案中将有一个新的网站项目,它将包含与普通网站项目不同的以下项:

  • Admin/{Default.aspx, web.config}
  • App_Code/{BasePage.cs, BaseMasterPage.cs}
  • App_Data/Web.sitemap
  • DefaultMaster.master
  • Global.asax
  • Login.aspx
  • Logout.aspx
  • web.config
  • Stylesheets/stylesheet.css
  • Scripts/JScript.js
  • Images/{Warning.gif, Error.gif, Information.gif}

再加上普通的 Default.aspx,但不同之处在于它将其母版页引用为 DefaultMaster.master

转到 web.config 文件,然后更改连接字符串以指向包含 ASP.NET membership 表的有效数据库。确认 membership 和 role 部分 web.config 文件中的 applicationName="" 属性指向的名称是否正确。

<roleManager enabled="true">
  <providers>

    <clear />
    <add name="AspNetSqlRoleProvider" 
         type="System.Web.Security.SqlRoleProvider, System.Web, 
               Version=2.0.0.0, Culture=neutral, 
               PublicKeyToken=b03f5f7f11d50a3a"         
         connectionStringName="appNameConnectionString" 
         applicationName="appName" />

  </providers>
</roleManager>
<membership>
  <providers>
    <clear />
      <add name="AspNetSqlMembershipProvider"

           type="System.Web.Security.SqlMembershipProvider, System.Web, 
                 Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
           connectionStringName="appNameConnectionString"
           ...
           applicationName="appName" .../>
      </providers>

    </membership>

将您的标头图像添加到 Images 文件夹。在 DefaultMaster.master 页面上,向 imgHeader 图像控件添加 ImageUrl="" 属性,以指向您的标头图像。

确保 web.config 中的密码正则表达式正确。当前表达式要求密码长度在 8 到 15 个字符之间,并要求使用

  1. 一个数字 (?=.*\d)
  2. 一个小写字母 (?=.*[a-z])
  3. 一个大写字母 (?=.*[A-Z])
  4. 以及一个特殊符号 (?=.*[!@#$%^&*()_+])
<membership>

  <providers>
    <add ... passwordStrengthRegularExpression="" />
    <appSettings>
    ...
    <add key="PasswordRegEx" 
         value="(?=^.{8,15}$)
                (?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()_+])
                (?!.*\s).*$"/>

  </appSettings>

开发一种记录应用程序中发生的错误的方法,并将其代码放置在 Global.asaxApplication_Error 方法和 BasePage.HandleException(Exception ex) 方法中。

public void HandleException(Exception ex)
{
    if (ConfigurationManager.AppSettings["Environment"] == "Development")
    {
        Master.ErrorMessage = ex.Message;
    }
    else
    {
        Master.ErrorMessage = "An unexpected error has occured in" + 
           "the application. If it continues, please contact the administrator.";
    }
    // TODO Log the exception somehow, either with
    // Microsoft.Practices.EnterpriseLibrary.Logging or some other mechanism
}

void Application_Error(object sender, EventArgs e) 
{
    // Code that runs when an unhandled error occurs

    //get reference to the source of the exception chain
    Exception lastError = Server.GetLastError();
    Exception ex;
    if (lastError.InnerException != null)
        ex = lastError.InnerException;
    else
        ex = lastError.GetBaseException();
    // TODO: Log the error somehow.
}

用户管理

在 Admin/Default.aspx 页面中,有一个基本的用户管理部分,允许具有 Admin 角色的用户批准/取消批准、解锁以及向系统中的用户添加/删除角色。

关注点

消息通过代码隐藏调用传递给用户:

  • base.InformationMessage = "我的信息消息";
  • base.ErrorMessage = "我的错误消息";
  • base.WarningMessage = "我的警告消息";

虽然“base.”语法不是必需的,但我总是放置它,以便任何未来的开发人员都知道某些基类包含这些属性的定义,而不是当前页面。

这些消息部分最初是不可见的,当传递给它们的字符串消息(有关更多详细信息,请参阅 BaseMasterPage.ErrorMessage)设置 EnableViewState = false 时,它们才会变得可见,因此在应用程序进行回发时,它们会消失。

母版页使用 CodeFileBaseClass="BaseMasterPage",以便 BaseMasterPage.cs 文件可以通过属性公开包含它们的 Labeldiv,从而允许页面引用它们。

<%@ Master Language="C#" AutoEventWireup="true" 
    Inherits="DefaultMaster" CodeFile="~/DefaultMaster.Master.cs"
    CodeFileBaseClass="BaseMasterPage" %>

BasePage 类隐藏了 Page.Master 属性,并将 MasterPage 强制转换为 BaseMasterPage,因此页面只需要引用其 ErrorMessage 属性。

public new BaseMasterPage Master { get { return (BaseMasterPage)base.Master; } }

public string ErrorMessage
{
  set { Master.ErrorMessage = value; }
}

将仅 ASP.NET Membership 和 Roles 表添加到数据库

仅将 ASP.NET Membership 表添加到数据库很容易,但需要您使用 aspnet_regsql.exe 文件的命令行。有关仅使用 ASP.NET membership 功能的信息,请在此处 查找

历史   

  • 2009 年 6 月 26 日 - 首次发布。
  • 2009 年 7 月 7 日 - 添加了用户管理部分
© . All rights reserved.