怎么在MVC中使用自定义Membership

首先我们来看看微软自带的membership:

我们打开系统下aspnet_regsql.exe 地址一般位于:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727  如果没问题一般都是在这个目录下面如果framework里面有多个版本可以选择V2.0以上版本即可

我装的window7打开的是framework v4.0 图片如下:

我们点击下一步:

默认下一步:

这一步我们选择登录方式然后选择数据库下一步

我选中了agebook 数据 然后我用sql server服务管理器打开看看是不是自动给我们生成了一些表。自带的还是不少表 但是我们为了要使用自己的会员表所以只是给大家看看了 我个人认为自带的不好用。

我们要自定义Membership类所以还是自己定义一个用户表吧

这个表待会儿我们会用到:

首先我们用VS2012创建一个MVC应用程序

我们先看看MembershipProvider这个系统自带的方法

using System;
using System.Configuration.Provider;
using System.Runtime;
using System.Runtime.CompilerServices;
using System.Web.Configuration;

namespace System.Web.Security
{
	// 摘要:
	//     定义 ASP.NET 为使用自定义成员资格提供程序提供成员资格服务而实现的协定。
	[TypeForwardedFrom("System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")]
	public abstract class MembershipProvider : ProviderBase
	{
		// 摘要:
		//     初始化 System.Web.Security.MembershipProvider 类的新实例。
		[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
		protected MembershipProvider();

		// 摘要:
		//     使用自定义成员资格提供程序的应用程序的名称。
		//
		// 返回结果:
		//     使用自定义成员资格提供程序的应用程序的名称。
		public abstract string ApplicationName { get; set; }
		//
		// 摘要:
		//     指示成员资格提供程序是否配置为允许用户重置其密码。
		//
		// 返回结果:
		//     如果成员资格提供程序支持密码重置,则为 true;否则为 false。默认值为 true。
		public abstract bool EnablePasswordReset { get; }
		//
		// 摘要:
		//     指示成员资格提供程序是否配置为允许用户检索其密码。
		//
		// 返回结果:
		//     如果成员资格提供程序配置为支持密码检索,则为 true,否则为 false。默认值为 false。
		public abstract bool EnablePasswordRetrieval { get; }
		//
		// 摘要:
		//     获取锁定成员资格用户前允许的无效密码或无效密码提示问题答案尝试次数。
		//
		// 返回结果:
		//     锁定成员资格用户之前允许的无效密码或无效密码提示问题答案尝试次数。
		public abstract int MaxInvalidPasswordAttempts { get; }
		//
		// 摘要:
		//     获取有效密码中必须包含的最少特殊字符数。
		//
		// 返回结果:
		//     有效密码中必须包含的最少特殊字符数。
		public abstract int MinRequiredNonAlphanumericCharacters { get; }
		//
		// 摘要:
		//     获取密码所要求的最小长度。
		//
		// 返回结果:
		//     密码所要求的最小长度。
		public abstract int MinRequiredPasswordLength { get; }
		//
		// 摘要:
		//     获取在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。
		//
		// 返回结果:
		//     在锁定成员资格用户之前允许的最大无效密码或无效密码提示问题答案尝试次数的分钟数。
		public abstract int PasswordAttemptWindow { get; }
		//
		// 摘要:
		//     获取一个值,该值指示在成员资格数据存储区中存储密码的格式。
		//
		// 返回结果:
		//     System.Web.Security.MembershipPasswordFormat 值之一,该值指示在数据存储区中存储密码的格式。
		public abstract MembershipPasswordFormat PasswordFormat { get; }
		//
		// 摘要:
		//     获取用于计算密码的正则表达式。
		//
		// 返回结果:
		//     用于计算密码的正则表达式。
		public abstract string PasswordStrengthRegularExpression { get; }
		//
		// 摘要:
		//     获取一个值,该值指示成员资格提供程序是否配置为要求用户在进行密码重置和检索时回答密码提示问题。
		//
		// 返回结果:
		//     如果密码重置和检索需要提供密码提示问题答案,则为 true;否则为 false。默认值为 true。
		public abstract bool RequiresQuestionAndAnswer { get; }
		//
		// 摘要:
		//     获取一个值,指示成员资格提供程序是否配置为要求每个用户名具有唯一的电子邮件地址。
		//
		// 返回结果:
		//     如果成员资格提供程序要求唯一的电子邮件地址,则返回 true;否则返回 false。默认值为 true。
		public abstract bool RequiresUniqueEmail { get; }

		// 摘要:
		//     在创建用户、更改密码或重置密码时发生。
		public event MembershipValidatePasswordEventHandler ValidatingPassword;

		// 摘要:
		//     处理更新成员资格用户密码的请求。
		//
		// 参数:
		//   username:
		//     为其更新密码的用户。
		//
		//   oldPassword:
		//     指定的用户的当前密码。
		//
		//   newPassword:
		//     指定的用户的新密码。
		//
		// 返回结果:
		//     如果密码更新成功,则为 true;否则为 false。
		public abstract bool ChangePassword(string username, string oldPassword, string newPassword);
		//
		// 摘要:
		//     处理更新成员资格用户的密码提示问题和答案的请求。
		//
		// 参数:
		//   username:
		//     要为其更改密码提示问题和答案的用户。
		//
		//   password:
		//     指定的用户的密码。
		//
		//   newPasswordQuestion:
		//     指定的用户的新密码提示问题。
		//
		//   newPasswordAnswer:
		//     指定的用户的新密码提示问题答案。
		//
		// 返回结果:
		//     如果成功更新密码提示问题和答案,则为 true;否则,为 false。
		public abstract bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer);
		//
		// 摘要:
		//     将新的成员资格用户添加到数据源。
		//
		// 参数:
		//   username:
		//     新用户的用户名。
		//
		//   password:
		//     新用户的密码。
		//
		//   email:
		//     新用户的电子邮件地址。
		//
		//   passwordQuestion:
		//     新用户的密码提示问题。
		//
		//   passwordAnswer:
		//     新用户的密码提示问题答案。
		//
		//   isApproved:
		//     是否允许验证新用户。
		//
		//   providerUserKey:
		//     成员资格数据源中该用户的唯一标识符。
		//
		//   status:
		//     一个 System.Web.Security.MembershipCreateStatus 枚举值,指示是否已成功创建用户。
		//
		// 返回结果:
		//     一个用新创建的用户的信息填充的 System.Web.Security.MembershipUser 对象。
		public abstract MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status);
		//
		// 摘要:
		//     解密已加密的密码。
		//
		// 参数:
		//   encodedPassword:
		//     一个字节数组,包含要解密的加密密码。
		//
		// 返回结果:
		//     包含已解密密码的字节数组。
		//
		// 异常:
		//   System.Configuration.Provider.ProviderException:
		//     将 System.Web.Configuration.MachineKeySection.ValidationKey 属性或 System.Web.Configuration.MachineKeySection.DecryptionKey
		//     属性设置为 AutoGenerate。
		protected virtual byte[] DecryptPassword(byte[] encodedPassword);
		//
		// 摘要:
		//     从成员资格数据源删除一个用户。
		//
		// 参数:
		//   username:
		//     要删除的用户的名称。
		//
		//   deleteAllRelatedData:
		//     如果为 true,则从数据库中删除与该用户相关的数据;如果为 false,则将与该用户相关的数据保留在数据库。
		//
		// 返回结果:
		//     如果用户被成功删除,则为 true;否则为 false。
		public abstract bool DeleteUser(string username, bool deleteAllRelatedData);
		//
		// 摘要:
		//     对密码进行加密。
		//
		// 参数:
		//   password:
		//     包含要加密的密码的字节数组。
		//
		// 返回结果:
		//     包含已加密的密码的字节数组。
		//
		// 异常:
		//   System.Configuration.Provider.ProviderException:
		//     将 System.Web.Configuration.MachineKeySection.ValidationKey 属性或 System.Web.Configuration.MachineKeySection.DecryptionKey
		//     属性设置为 AutoGenerate。
		[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
		protected virtual byte[] EncryptPassword(byte[] password);
		//
		// 摘要:
		//     使用指定的密码兼容性模式对指定密码进行加密。
		//
		// 参数:
		//   password:
		//     包含要加密的密码的字节数组。
		//
		//   legacyPasswordCompatibilityMode:
		//     成员资格密码兼容性模式。
		//
		// 返回结果:
		//     包含已加密的密码的字节数组。
		protected virtual byte[] EncryptPassword(byte[] password, MembershipPasswordCompatibilityMode legacyPasswordCompatibilityMode);
		//
		// 摘要:
		//     获取一个成员资格用户的集合,其中的电子邮件地址包含要匹配的指定电子邮件地址。
		//
		// 参数:
		//   emailToMatch:
		//     要搜索的电子邮件地址。
		//
		//   pageIndex:
		//     要返回的结果页的索引。pageIndex 从零开始。
		//
		//   pageSize:
		//     要返回的结果页的大小。
		//
		//   totalRecords:
		//     匹配用户的总数。
		//
		// 返回结果:
		//     包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection
		//     集合,这些对象从 pageIndex 指定的页开始。
		public abstract MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords);
		//
		// 摘要:
		//     获取一个成员资格用户的集合,其中的用户名包含要匹配的指定用户名。
		//
		// 参数:
		//   usernameToMatch:
		//     要搜索的用户名。
		//
		//   pageIndex:
		//     要返回的结果页的索引。pageIndex 从零开始。
		//
		//   pageSize:
		//     要返回的结果页的大小。
		//
		//   totalRecords:
		//     匹配用户的总数。
		//
		// 返回结果:
		//     包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection
		//     集合,这些对象从 pageIndex 指定的页开始。
		public abstract MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords);
		//
		// 摘要:
		//     获取数据源中的所有用户的集合,并显示在数据页中。
		//
		// 参数:
		//   pageIndex:
		//     要返回的结果页的索引。pageIndex 从零开始。
		//
		//   pageSize:
		//     要返回的结果页的大小。
		//
		//   totalRecords:
		//     匹配用户的总数。
		//
		// 返回结果:
		//     包含一页 pageSizeSystem.Web.Security.MembershipUser 对象的 System.Web.Security.MembershipUserCollection
		//     集合,这些对象从 pageIndex 指定的页开始。
		public abstract MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords);
		//
		// 摘要:
		//     获取当前访问该应用程序的用户数。
		//
		// 返回结果:
		//     当前访问该应用程序的用户数。
		public abstract int GetNumberOfUsersOnline();
		//
		// 摘要:
		//     从数据源获取指定用户名所对应的密码。
		//
		// 参数:
		//   username:
		//     为其检索密码的用户。
		//
		//   answer:
		//     用户的密码提示问题答案。
		//
		// 返回结果:
		//     指定用户名所对应的密码。
		public abstract string GetPassword(string username, string answer);
		//
		// 摘要:
		//     根据成员资格用户的唯一标识符从数据源获取用户信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
		//
		// 参数:
		//   providerUserKey:
		//     要获取其信息的成员资格用户的唯一标识符。
		//
		//   userIsOnline:
		//     如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
		//
		// 返回结果:
		//     用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
		public abstract MembershipUser GetUser(object providerUserKey, bool userIsOnline);
		//
		// 摘要:
		//     从数据源获取用户的信息。提供一个更新用户最近一次活动的日期/时间戳的选项。
		//
		// 参数:
		//   username:
		//     要获取其信息的用户名。
		//
		//   userIsOnline:
		//     如果为 true,则更新用户最近一次活动的日期/时间戳;如果为 false,则返回用户信息,但不更新用户最近一次活动的日期/时间戳。
		//
		// 返回结果:
		//     用数据源中指定用户的信息填充的 System.Web.Security.MembershipUser 对象。
		public abstract MembershipUser GetUser(string username, bool userIsOnline);
		//
		// 摘要:
		//     获取与指定的电子邮件地址关联的用户名。
		//
		// 参数:
		//   email:
		//     要搜索的电子邮件地址。
		//
		// 返回结果:
		//     与指定的电子邮件地址关联的用户名。如果未找到匹配项,则返回 null。
		public abstract string GetUserNameByEmail(string email);
		//
		// 摘要:
		//     如果定义了事件处理程序,则引发 System.Web.Security.MembershipProvider.ValidatingPassword
		//     事件。
		//
		// 参数:
		//   e:
		//     传递给 System.Web.Security.MembershipProvider.ValidatingPassword 事件处理程序的 System.Web.Security.ValidatePasswordEventArgs。
		protected virtual void OnValidatingPassword(ValidatePasswordEventArgs e);
		//
		// 摘要:
		//     将用户密码重置为一个自动生成的新密码。
		//
		// 参数:
		//   username:
		//     为其重置密码的用户。
		//
		//   answer:
		//     指定的用户的密码提示问题答案。
		//
		// 返回结果:
		//     指定的用户的新密码。
		public abstract string ResetPassword(string username, string answer);
		//
		// 摘要:
		//     清除锁定,以便可以验证该成员资格用户。
		//
		// 参数:
		//   userName:
		//     要清除其锁定状态的成员资格用户。
		//
		// 返回结果:
		//     如果成功取消成员资格用户的锁定,则为 true;否则为 false。
		public abstract bool UnlockUser(string userName);
		//
		// 摘要:
		//     更新数据源中有关用户的信息。
		//
		// 参数:
		//   user:
		//     一个 System.Web.Security.MembershipUser 对象,表示要更新的用户及其更新信息。
		public abstract void UpdateUser(MembershipUser user);
		//
		// 摘要:
		//     验证数据源中是否存在指定的用户名和密码。
		//
		// 参数:
		//   username:
		//     要验证的用户的名称。
		//
		//   password:
		//     指定的用户的密码。
		//
		// 返回结果:
		//     如果指定的用户名和密码有效,则为 true;否则为 false。
		public abstract bool ValidateUser(string username, string password);
	}
}

有这么多 方法 我们的写它因为要自定义一个自己的Membership类如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.OleDb;

using System.Data.SqlClient;

/// <summary>

/// MyMemberShip 的摘要说明

/// </summary>

public class MyMemberShip : MembershipProvider

{

public MyMemberShip()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

string connectionstring = ConfigurationManager.ConnectionStrings["LocalSqlServer"].ConnectionString.ToString();

private bool _requiresQuestionAndAnswer;

private int _minRequiredPasswordLength;

public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)

{

if (config["requiresQuestionAndAnswer"].ToLower() == "true")

{

_requiresQuestionAndAnswer = true;

}

else

{

_requiresQuestionAndAnswer = false;

}

int.TryParse(config["minRequiredPasswordLength"], out _minRequiredPasswordLength);

//connStr = config["connectionString"];

base.Initialize(name, config);

}

public override string ApplicationName

{

get

{

throw new Exception("The method or operation is not implemented.");

}

set

{

throw new Exception("The method or operation is not implemented.");

}

}

public override bool ChangePassword(string username, string oldPassword, string newPassword)

{

throw new Exception("The method or operation is not implemented.");

}

public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)

{

throw new Exception("The method or operation is not implemented.");

}

public override MembershipUser CreateUser(string username,string password,string email,string passwordQuestion,string passwordAnswer,bool isApproved,Object providerUserKey,out MembershipCreateStatus status)

{

using (SqlConnection conn = new SqlConnection(connectionstring))

{

SqlCommand comm = new SqlCommand();

comm.CommandText = "insert into users(u_name,u_pwd,u_role) values(@cname,@cpwd,@crole)";

comm.Parameters.AddWithValue("@cname", username);

comm.Parameters.AddWithValue("@cpwd", password);

comm.Parameters.AddWithValue("@crole", "guest");

comm.Connection = conn;

conn.Open();

comm.ExecuteNonQuery();

MembershipUser user = new MembershipUser("MyMemberShip", username, providerUserKey, email, passwordQuestion, "", isApproved, true, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now, DateTime.Now);

status = MembershipCreateStatus.Success;

return user;

}

}

public override bool DeleteUser(string username, bool deleteAllRelatedData)

{

throw new Exception("The method or operation is not implemented.");

}

public override bool EnablePasswordReset

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override bool EnablePasswordRetrieval

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)

{

throw new Exception("The method or operation is not implemented.");

}

public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)

{

throw new Exception("The method or operation is not implemented.");

}

public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)

{

throw new Exception("The method or operation is not implemented.");

}

public override int GetNumberOfUsersOnline()

{

throw new Exception("The method or operation is not implemented.");

}

public override string GetPassword(string username, string answer)

{

throw new Exception("The method or operation is not implemented.");

}

public override MembershipUser GetUser(string username, bool userIsOnline)

{

throw new Exception("The method or operation is not implemented.");

}

public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)

{

throw new Exception("The method or operation is not implemented.");

}

public override string GetUserNameByEmail(string email)

{

throw new Exception("The method or operation is not implemented.");

}

public override int MaxInvalidPasswordAttempts

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override int MinRequiredNonAlphanumericCharacters

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override int MinRequiredPasswordLength

{

get { return _minRequiredPasswordLength; }

}

public override int PasswordAttemptWindow

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override MembershipPasswordFormat PasswordFormat

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override string PasswordStrengthRegularExpression

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override bool RequiresQuestionAndAnswer

{

get { return _requiresQuestionAndAnswer; }

}

public override bool RequiresUniqueEmail

{

get { throw new Exception("The method or operation is not implemented."); }

}

public override string ResetPassword(string username, string answer)

{

throw new Exception("The method or operation is not implemented.");

}

public override bool UnlockUser(string userName)

{

throw new Exception("The method or operation is not implemented.");

}

public override void UpdateUser(MembershipUser user)

{

throw new Exception("The method or operation is not implemented.");

}

public override bool ValidateUser(string username, string password)

{

using (SqlConnection conn = new SqlConnection(connectionstring))

{

SqlCommand comm = new SqlCommand();

comm.CommandText = "select count(0) from users where [email protected] and [email protected]";

comm.Parameters.AddWithValue("@cname", username);

comm.Parameters.AddWithValue("@cpwd", password);

comm.Connection = conn;

conn.Open();

return ((int)comm.ExecuteScalar()) > 0 ? true : false;

}

}

}

这个类里面包括了很多验证的方法具体我就不介绍了

接下来我们看看配置文件怎么配置:

<configuration>下

<connectionStrings>

<remove name="LocalSqlServer" />

<add name="LocalSqlServer" connectionString="Data Source=.;Initial Catalog=agebook;Persist Security Info=True;User ID=sa;Password=sa" providerName="System.Data.SqlClient" />

</connectionStrings>

记着加入forms验证

<compilation debug="true" targetFramework="4.0" />

<!--<authentication mode="Windows" />-->

<authentication mode="Forms"/>

<authorization>

<allow users="*" />

</authorization>

也可以这样:

<authentication mode="Forms">

<forms loginUrl="/Home/Login" name="login"/>

</authentication>

配置MemberShip节点

<system.web>内配置:

<membership defaultProvider="MyMemberShip" userIsOnlineTimeWindow="20">

<providers>

<remove name="AspNetSqlProvider" />

<add name="MyMemberShip"

type="MyMemberShip"

connectionStringName="SqlServices"

enablePasswordRetrieval="false"

enablePasswordReset="true"

requiresQuestionAndAnswer="true"

passwordFormat="Hashed"

applicationName="/" />

</providers>

</membership>

<profile>

<providers>

<clear/>

<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName=" LocalSqlServer "  applicationName="/" />

</providers>

</profile>

最后我们在测试一下登录页面

<form action=‘/Home/Login‘ method="post">

用户名:@Html.TextBox("Username")

密码:@Html.Password("Password")

<input type="submit" value="登录" />

</form>

控制页面代码如下:

string name = Request.Form["Username"];

string pwd = Request.Form["Password"];

if (name == "" || name == null)

name = "t";

if (pwd == "" || pwd == null)

pwd = "s";

if (Membership.ValidateUser(name, pwd))

{

Response.Write("您的登录名称:" + User.Identity.Name + " <br>权限为:");

foreach (string s in Roles.GetRolesForUser(name))

{

Response.Write("<li>" + s + "</li>");

}

}

是不是感觉给自己写的登录方法差不多吧!自带的用户登录控件就带MemberShip包括以前微软最有名的一个事例 PetShop4.0也用了它,一般控件开发用的比较多些,现在不知道用的人还多不多,最近有人问我Membership这问题所以就总结一下,希望对大家有所帮助。

时间: 2024-10-20 23:27:58

怎么在MVC中使用自定义Membership的相关文章

asp.net MVC中如何用Membership类和自定义的数据库进行登录验证

asp.net MVC 内置的membershipProvider可以实现用户登陆验证,但是它用的是自动创建的数据库,所以你想用本地数据库数据去验证,是通过不了的. 如果我们想用自己的数据库的话,可以写自己的membershipProvider!下面介绍如果创建自己的membershipProvider: 1.写自己的MembershipProvider类,这个类继承自命名空间System.Web.Security下的MembershipProvider类 这个类放在哪无所谓,这里我放在新建My

在 ASP.NET MVC 中创建自定义 HtmlHelper

在ASP.NET MVC应用程序的开发中,我们常碰到类似Html.Label或Html.TextBox这样的代码,它将在网页上产生一个label或input标记.这些HtmlHelper的扩展方法有些像WebForm中的控件,只需传入一些参数即可生成相应的HTML代码.本文将介绍创建HtmlHelper的方法. Html.Textbox方法的返回值是MvcHtmlString,它生成了一些HTML代码.创建HtmlHelper,就像在生成HTML代码.下面以一个带有简要描述功能的链接HtmlHe

ASP.NET MVC如何实现自定义验证(服务端验证+客户端验证)

ASP.NET MVC通过Model验证帮助我们很容易的实现对数据的验证,在默认的情况下,基于ValidationAttribute的声明是验证被使用,我们只需 要将相应的ValidationAttribute应用到Model的类型或者属性上即可.对于自定义验证,我们也只需要定义相应的Validation 就可以了,不过服务端验证比较简单,而客户端验证就要稍微复杂一些,本文提供一个简单的实例说明在ASP.NET MVC中实现自定义验证的基本步骤.[源代码从这里下载] 一.AgeRangeAttr

MVC中关于Membership类跟数据库的问题

Membership它们用的是ASPNETDB这个数据库,但我们可以使用我们自定义的数据库,然而除非我们自定义的数据库有着跟这个ASPNETDB一样的模式,否则ASP.NET提供的默认的SqlMembershipProvider将无法被使用.也就是说,如果我们还要用ASP.NET提供的SqlMembershipProvider,我们就必须ASPNETDB这个数据库文件或是它的拷贝.明显,这不是我们要的.为此,若我们使用了自定义的数据库(而非ASPNETDB的拷贝),那么我们就必须写自己的Memb

YbSoftwareFactory 代码生成插件【二十四】:MVC中实现动态自定义路由

上一篇介绍了 公文流转系统 的实现,本篇介绍下MVC下动态自定义路由的实现. 在典型的CMS系统中,通常需要为某个栏目指定个友链地址,通过指定友链地址,该栏目的地址更人性化.方便记忆,也有利用于搜索引擎优化. 但在MVC中,通常需要在应用程序启动时注册路由规则,该路由规则又通常和控制器进行了关联,也就是某个地址通常情况下都是有对应的控制器进行处理的.但在MVC中如何做到自定义动态路由,以便能在运行时通过某个控制器处理一些运行时动态设定的Url地址呢? 方法当然是有的:    1.首先实现一个动态

在.Net MVC中自定义ValidationAttribute标签对Model中的属性做验证

写一个继承与ValidationAttribute类的自定义的验证方法 MVC中传递数据时,大多数都会用Model承载数据,并且在传到控制器后,对Model进行一系列的验证. 我平时经常使用的判断方法比Low,因为Model都是不同的,也需要返回很多不同的信息,所以我都是把很多条件语句封装成私有方法,放在控制器的最下边,然后使用的时候直接调用. 下图就是我平时使用的代码格式,我把验证方法都写在了这里,很低级请轻喷. 其实在.Net MVC中,已经提供了很好的验证方法,就是在属性上面加Valida

.net mvc中AOP 异常捕获后返回自定义的Json

.net mvc中封装了一些特性可以实现AOP,如常用的HandleErrorAttribute,ActionFilterAttribute,AuthorizeAttribute.自定义一个特性,继承这些特性,并重写里面的方法就可以AOP切入到Action中的关注点.本篇文章主要对笔者在使用HandleErrorAttribute的过程中遇到的一个问题进行分享. 我们在action中会用try..catch..进行异常处理,笔者在catch中返回一个json(标示失败).我发现所有的action

Attribute(二)——自定义特性+Asp.net MVC中的filter详解

上篇博客是关于特性中有关预定义特性的一些基础,同时也是对Attribute这一概念的一个宏观上的认识,在上篇博客结尾介绍了有关为自定义特性服务的AttributeUsage,这篇博客主要是通过filter的使用间接的了解自定义特性的具体应用. 一.filter简介 在了解自定义特性前,先引入一个概念filter,它是MVC中自带的一种功能,在我们项目中通常会遇到在Action执行前或结束时,去执行日志记录或错误处理等功能,通常可使用AOP截取来实现,但是在MVC中提供了filter过滤,大大方便

【ASP.NET Core】MVC中自定义视图的查找位置

.NET Core 的内容处处可见,刷爆全球各大社区,所以,老周相信各位大伙伴已经看得不少了,故而,老周不考虑一个个知识点地去写,那样会成为年度最大的屁话,何况官方文档也很详尽.老周主要扯一下大伙伴们在入门的时候可能会疑惑的内容. ASP.NET Core 可以在一个项目中混合使用 Web Pages 和 MVC ,这是老周最希望的,因为这样会变得更灵活.Web Pages 类似于我们过去的 Web 开发方式,以页面为单位,此模型侧重于功能划分.而 MVC 侧重于数据,有什么样的数据模型就有什么