首先我们来看看微软自带的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 u_name=@cname and u_pwd=@cpwd";

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这问题所以就总结一下,希望对大家有所帮助。

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

  1. [转]怎么在MVC中使用自定义Membership

    本文转自:http://www.cnblogs.com/angelasp/p/4078244.html 首先我们来看看微软自带的membership: 我们打开系统下aspnet_regsql.exe ...

  2. MVC中利用自定义的ModelBinder过滤关键字

    上一篇主要讲解了如何利用ActionFilter过滤关键字,这篇主要讲解如何利用自己打造的ModelBinder来过滤关键字. 首先,我们还是利用上一篇中的实体类,但是我们需要加上DataType特性 ...

  3. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

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

    asp.net MVC 内置的membershipProvider可以实现用户登陆验证,但是它用的是自动创建的数据库,所以你想用本地数据库数据去验证,是通过不了的. 如果我们想用自己的数据库的话,可以 ...

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

    在ASP.NET MVC应用程序的开发中,我们常碰到类似Html.Label或Html.TextBox这样的代码,它将在网页上产生一个label或input标记.这些HtmlHelper的扩展方法有些 ...

  6. 在Spring MVC 中配置自定义的类型转换器

    方法一: 实现spring mvc 自带的 Formatter 接口 1.创建一个类来实现Formatter接口 import org.springframework.format.Formatter ...

  7. MultipleRegularExpressionAttribute MVC中扩展自定义验证规则

    好久都没有写博客,最近工作中没有什么可写的,公司的项目是以业务为重,技术含量实在不咋的.这次sprint中有一个要求就是password必须一些规则,比如给你一些正则表达式必须满足几个,直接看效果吧 ...

  8. 在ASP.NET MVC中创建自定义模块

    创建模块 module是实现了System.Web.IHttpModule接口的类.该接口定义了两个方法: Init:当模块初始化时被调用,传入的参数为HttpApplication对象,用于注册请求 ...

  9. MVC中的自定义标签分页控件,仅供大家学习!!

    public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, ...

随机推荐

  1. java compiler level does not match the version of the installed java project facet 解决方案

    项目出现 java compiler level does not match the version of the installed java project facet 错误,一般是项目移植出现 ...

  2. 【Win10应用开发】相对布局(RelativePanel)

    外面的雨下得很大,老周就决定雨下漫笔了. 今天咱们说一个新控件——RelativePanel.本质上,它就是一个面板,面板干啥用的?面板就是一个容器,里面可以放其他对象,就像我们小时候玩的七巧板一样, ...

  3. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  4. Java 8新特性-5 内建函数式接口

    在之前的一片博文 Lambda 表达式,提到过Java 8提供的函数式接口.在此文中,将介绍一下Java 8四个最基本的函数式接口 对于方法的引用,严格来讲都需要定义一个接口.不管我们如何操作实际上有 ...

  5. ES6 - Note6:Set与Map

    Set和Map是ES6中新增的数据结构,Set是集合,无序唯一,Map类似于对象,也是"key-value"形式,但是key不局限于字符串. 1.Set的用法 Set是构造函数,可 ...

  6. .Net中DataAdapter批量插入和更新数据总结

    前言 前段时间一直在忙着项目上线,在做项目的同时遇到了一些之前不曾碰到的问题,因为没有经验,只能从网上找一些相关的解决方案,但是网上提供的资料实在是太杂,有的根本不能用,耗时又耗力. 我希望把我这段时 ...

  7. Unity调用Android类方法

    Unity调用Android类方法 1.  添加Unity的classes.jar文件 创建一个Android工程AndroidUnityDemo. 由于Unity的版本不同,直接在Unity安装包文 ...

  8. 使用FlexPaper实现office文件的预览(C#版)

    需求很简单,用户上传office文件(word.excel.ppt)后,可以预览上传的这些文件.搜索的相关的资料后.整理如下: Step1.用户上传office文件. Step2.把Office文件转 ...

  9. maven全局配置文件settings.xml详解

    概要 settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径. settings.xml文件是干什么的,为什么要配置它 ...

  10. linux源码分析(五)-start_kernel

    前置:这里使用的linux版本是4.8,x86体系. local_irq_disable(); 这个函数是做了关闭中断操作.和后面的local_irq_enable相对应.说明启动的下面函数是不允许被 ...