学习地址:http://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html

本文和学习地址不一样的地方是我自己添加了一些简单的注释和理解。

1.添加用户模型类和用户组模型类:Model/User.cs和Model/UserGroup.cs

User.cs

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; namespace RegisterExample.Models
{
/// <summary>
/// 用户模型
/// </summary> public class User
{
[Key]
public int UserId { get; set; }
/// <summary>
/// 用户组Id
/// </summary>
// [System.Web.Mvc.Remote("Exists", "User", ErrorMessage = "用户名已存在")] //Remote特性可以利用服务器端的毁掉函数执行客户端的验证逻辑。在特性中可以设置客户端代码要调用的控制器名称和操作名称,这里的控制器名称是“User”,操作名称是“Exists”
[Display(Name = "用户组Id")] //Display特性可以为模型属性设置友好的“显示名称”
[Required(ErrorMessage = "×")] //当Required 指定的属性为null或空是,它的特性将会引发一个验证错误。ErrorMessage可以自定义错误提示消息。 public int GroupId { get; set; }
/// <summary>
/// 用户名
/// </summary> [Display(Name = "用户名", Description = "4-20个字符。")] //上面提到Name是显示名称,Description是提示。
[Required(ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")] //StringLength验证特性,这里的20表示允许的最大长度值,MinimumLength=4表示设定字符串的最小长度是4.若不符合设定值范围,则返回ErrorMessage的自定义错误提示消息。
public string UserName { get; set; }
/// <summary>
/// 密码
/// </summary>
[Display(Name = "密码")]
[Required(ErrorMessage = "×")]
[StringLength()]
public string Password { get; set; }
/// <summary>
/// 性别【0-男;1-女;2-保密】
/// </summary>
[Display(Name = "性别")]
[Required(ErrorMessage = "×")]
[Range(, , ErrorMessage = "×")] //Range(中文意思是范围)特性用来指定数值类型值的最小值和最大值。
public byte Gender { get; set; }
/// <summary>
/// Email
/// </summary>
[Display(Name = "Email", Description = "请输入您常用的Email。")]
[Required(ErrorMessage = "×")]
[EmailAddress(ErrorMessage = "×")]
public string Email { get; set; }
/// <summary>
/// 密保问题
/// </summary>
[Display(Name = "密保问题", Description = "请正确填写,在您忘记密码时用户找回密码。4-20个字符。")]
[Required(ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")]
public string SecurityQuestion { get; set; }
/// <summary>
/// 密保答案
/// </summary>
[Display(Name = "密保答案", Description = "请认真填写,忘记密码后回答正确才能找回密码。2-20个字符。")]
[Required(ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")]
public string SecurityAnswer { get; set; }
/// <summary>
/// QQ号码
/// </summary>
[Display(Name = "QQ号码")]
[RegularExpression("^[1-9][0-9]{4-13}$", ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")]
public string QQ { get; set; }
/// <summary>
/// 电话号码
/// </summary>
[Display(Name = "电话号码", Description = "常用的联系电话(手机或固话),固话格式为:区号-号码。")]
[RegularExpression("^[0-9-]{11-13}$", ErrorMessage = "×")]
public string Tel { get; set; }
/// <summary>
/// 联系地址
/// </summary>
[Display(Name = "联系地址", Description = "常用地址,最多80个字符。")]
[StringLength(, ErrorMessage = "×")]
public string Address { get; set; }
/// <summary>
/// 邮编
/// </summary>
[Display(Name = "邮编")]
[RegularExpression("^[0-9]{6}$", ErrorMessage = "×")] //RegularExpression意思是正则表达式,是一种检查字符串和内容的简洁有效方式。如果输入的信息不能喝正则表达式匹配,就会看到错误提示消息。
public string PostCode { get; set; }
/// <summary>
/// 注册时间
/// </summary>
public DateTime? RegTime { get; set; } // DateTime 是值类型,.NET 值类型一经初始化,就有必须有值,不能赋 null。但是数据库中任意类型都可以有空null,所以,.net 2.0 引入了可空类型,建立在泛型的基础上,int? 是 C# 的特定语法,实际上是 Nullable<int>
//int? num1;
//int num2;
//num1 = null;这是对的。
//num2 = null;这是错的。
/// <summary>
/// 上次登录时间
/// </summary>
public DateTime? LastLoginTime { get; set; } /// <summary>
/// 用户组
/// </summary>
public virtual UserGroup Group { get; set; } //表示一个用户对应于一个用户组
}
}

UserGroup.cs

using System.ComponentModel.DataAnnotations;

namespace RegisterExample.Models
{
/// <summary>
/// 用户组
/// </summary>
public class UserGroup
{
[Key]
public int UserGroupId { get; set; }
/// <summary>
/// 用户组类型
/// </summary>
[Display(Name = "类型")]
[Required(ErrorMessage = "×")]
public UserGroupType Type { get; set; }
/// <summary>
/// 用户组名称
/// </summary>
[Display(Name = "名称", Description = "2-12个字符。")]
[Required(ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")]
public string Name { get; set; }
/// <summary>
/// 说明
/// </summary>
[Display(Name = "说明", Description = "最多50个字符。")]
[StringLength(, ErrorMessage = "×")]
public string Description { get; set; }
}
/// <summary>
/// 用户组类型
/// </summary>
public enum UserGroupType
{
Anonymous, Limited, Normal, Special
}
}

2.添加控制器Control/UserControl.cs,然后先放着不管它。

3.在项目新建Repository文件夹,新建类:Repository/RegisterContext.cs,用来实现EF的Context。

RegisterContext.cs

using RegisterExample.Models;
using System.Data.Entity; namespace RegisterExample.Repository
{
public class RegisterContext : DbContext
{
public DbSet<User> Users { get; set; }
public RegisterContext()
: base("DefaultConnection") //数据库连接字符串名字
{
Database.CreateIfNotExists();
}
}
}

4.新建类:Repository/RepositotyBase.cs,可以用来做UserRepository的基类,里面写Add,Update,Delete,Find几个虚函数,方便在继承类里面这几个函数的名称统一。

RepositotyBase.cs

namespace RegisterExample.Repository
{
//建一个类RepositoryBase,用来做***Repository的基类,里面写Add,Update,Delete,Find几个虚函数,方便在继承类里面这几个函数的名称统一。
public class RepositoryBase<TModel>
{
private RegisterContext dbContext;
public RepositoryBase()
{
dbContext = new RegisterContext();
}
/// <summary>
/// 添加【继承类重写后才能正常使用】
/// </summary>
public virtual bool Add(TModel TModel) { return false; } //在基类中,必须将允许重写的每个成员标记为virtual。假如一个public或protected成员没有包含virtual修饰符,就不允许子类重写该成员。virtual标志着方法或属性可在派生类中被替换(重写)。
/// <summary>
/// 更新【继承类重写后才能正常使用】
/// </summary>
public virtual bool Update(TModel TModel) { return false; }
/// <summary>
/// 删除【继承类重写后才能正常使用】
/// </summary>
public virtual bool Delete(int Id) { return false; }
/// <summary>
/// 查找指定值【继承类重写后才能正常使用】
/// </summary>
public virtual TModel Find(int Id) { return default(TModel); }
~RepositoryBase() //不知道为什么前面要加“~”。
{
if (dbContext != null)
{
dbContext.Dispose();
}
}
}
}

5.新建类:Repository/UserRepository.cs,重写Add和Update方法。

UserRepository.cs

using System.Linq;
using RegisterExample.Models; namespace RegisterExample.Repository
{
public class UserRepository:RepositoryBase<User>
{
private RegisterContext dbContext;
public UserRepository()
{
dbContext = new RegisterContext();
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="user">用户信息</param>
/// <returns></returns>
//用override修饰的任何成员都自动成为虚成员,用override修饰的任何方法都自动成为虚方法。只能对基类的虚方法进行重写,所以重写的方法也是虚方法。
public override bool Add(User user)
{
if (user == null) return false;
dbContext.Users.Add(user);
if (dbContext.SaveChanges() > ) return true;
else return false;
}
/// <summary>
/// 更新用户信息
/// </summary>
/// <param name="user"></param>
/// <returns></returns>
public override bool Update(User user)
{
dbContext.Users.Attach(user);
dbContext.Entry<User>(user).State = System.Data.EntityState.Modified;
if (dbContext.SaveChanges() > ) return true;
else return false;
}
/// <summary>
/// 检查用户是否存在
/// </summary>
/// <param name="UserName"></param>
/// <returns></returns>
public bool Exists(string UserName)
{
if (dbContext.Users.Any(u => u.UserName.ToUpper() == UserName.ToUpper())) return true;
else return false;
}
}
}

6.在项目新建Extensions文件夹,添加类Extemporaneous/DisplayDescriptionExtensions.cs,在生成的代码中将命名空间改为System.Web.Mvc.Html,添加两个静态方法DisplayDescription和DisplayDescriptionFor。

DisplayDescriptionExtensions.cs

using System.Linq.Expressions;

namespace System.Web.Mvc.Html
{
public static class DisplayDescriptionExtensions
{
/// <summary>
/// 模型描述信息
/// </summary>
/// <param name="htmlHelper"></param>
/// <param name="name"></param>
/// <returns></returns>
public static MvcHtmlString DisplayDescription(this HtmlHelper htmlHelper, string name)
{
ModelMetadata _modelMetadata = ModelMetadata.FromStringExpression(name, htmlHelper.ViewData);
return MvcHtmlString.Create(_modelMetadata.Description);
}
/// <summary>
/// 模型描述信息
/// </summary>
/// <typeparam name="TModel"></typeparam>
/// <typeparam name="TResult"></typeparam>
/// <param name="htmlHelper"></param>
/// <param name="expression"></param>
/// <returns></returns>
public static MvcHtmlString DisplayDescriptionFor<TModel, TResult>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TResult>> expression)
{
ModelMetadata _modelMetadata = ModelMetadata.FromLambdaExpression(expression,htmlHelper.ViewData);
return MvcHtmlString.Create(_modelMetadata.Description);
}
}
}

8.制作验证码,上一篇文章主要讲这个,这里不多说。

9.在Models里添加用户注册模型类UserRegister 继承自User,在类中new一下密码字段,并添加重复密码和验证码字段。

写在Model/Users.cs上

 /// <summary>
/// 用户注册模型
/// </summary>
[NotMapped]
public class UserRegister : User
{
/// <summary>
/// 密码
/// </summary>
[Display(Name = "密码", Description = "6-20个字符。")]
[Required(ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")]
[DataType(DataType.Password)]
public new string Password { get; set; }
/// <summary>
/// 确认密码
/// </summary>
[Display(Name = "确认密码", Description = "再次输入密码。")]
[Compare("Password", ErrorMessage = "×")] //Compare特性用于确保模型对象的两个属性具有相同的值。
[DataType(DataType.Password)]
public string ConfirmPassword { get; set; }
/// <summary>
/// 验证码
/// </summary>
[Display(Name = "验证码", Description = "请输入图片中的验证码。")]
[Required(ErrorMessage = "×")]
[StringLength(, MinimumLength = , ErrorMessage = "×")]
public string VerificationCode { get; set; }
/// <summary>
/// 没加密的用户信息
/// </summary>
/// <returns></returns>
public User GetUser()
{
//Password = Common.Text.Sha256(this.Password)
return new User { Address = this.Address, Email = this.Email, Gender = this.Gender, GroupId = this.GroupId, Password = this.Password, PostCode = this.PostCode, QQ = this.QQ, RegTime = this.RegTime, SecurityAnswer = this.SecurityAnswer, SecurityQuestion = this.SecurityQuestion, Tel = this.Tel, UserName = this.UserName };
}

9.控制器UserControl代码。

using System.Web.Mvc;
using RegisterExample.Models;
using RegisterExample.Repository;
using System.Drawing; namespace RegisterExample.Controllers
{
public class UserController : Controller
{
private UserRepository userRsy; //
// GET: /User/ public ActionResult Index()
{
return View();
}
public ActionResult Register() {
return View();
}
[HttpPost]
public ActionResult Register(UserRegister userReg)
{
if (Session["VerificationCode"] == null || Session["VerificationCode"].ToString() == "")
{
Error _e = new Error { Title = "验证码不存在", Details = "在用户注册时,服务器端的验证码为空,或向服务器提交的验证码为空", Cause = Server.UrlEncode("<li>你注册时在注册页面停留的时间过久页已经超时</li><li>您绕开客户端验证向服务器提交数据</li>"), Solution = Server.UrlEncode("返回<a href='" + Url.Action("Register", "User") + "'>注册</a>页面,刷新后重新注册") };
return RedirectToAction("Error", "Prompt", _e);
}
else if (Session["VerificationCode"].ToString() != userReg.VerificationCode.ToUpper())
{
ModelState.AddModelError("VerificationCode", "×");
return View();
}
userRsy = new UserRepository();
if (userRsy.Exists(userReg.UserName))
{
ModelState.AddModelError("UserName", "用户名已存在");
return View();
}
User _user = userReg.GetUser();
_user.RegTime = System.DateTime.Now;
if (userRsy.Add(_user))
{
Notice _n = new Notice { Title = "注册成功", Details = "您已经成功注册,用户为:" + _user.UserName + " ,请牢记您的密码!", DwellTime = , NavigationName = "登陆页面", NavigationUrl = Url.Action("Login", "User") };
return RedirectToAction("Notice", "Prompt", _n);
}
else
{
Error _e = new Error { Title = "注册失败", Details = "在用户注册时,发生了未知错误", Cause = "系统错误", Solution = Server.UrlEncode("<li>返回<a href='" + Url.Action("Register", "User") + "'>注册</a>页面,输入正确的信息后重新注册</li><li>联系网站管理员</li>") };
return RedirectToAction("Error", "Prompt", _e);
}
}
/// <summary>
/// 绘制验证码
/// </summary>
/// <returns></returns>
public ActionResult VerificationCode()
{
int _verificationLength = ; //定义一个整数变量,作为验证码的长度。
int _width = , _height = ;//验证码背景大小?
SizeF _verificationTextSize;//存储有序浮点数对,通常为矩形的宽度和高度。 SizeF 结构的 Height 和 Width 的单位取决于用于绘制的 Graphics 对象的 PageUnit 和 PageScale 设置。
Bitmap _bitmap = new Bitmap(Server.MapPath("~/Content/Images/Texture.jpg"), true);//Bitmap类是封装 GDI+ 位图,此位图由图形图像及其特性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。 TextureBrush _brush = new TextureBrush(_bitmap);//TextureBrush 类的每个属性都是 Brush 对象,这种对象使用图像来填充形状的内部。 此类不能被继承。 //获取验证码
string _verificationText = Common.Text.VerificationText(_verificationLength);//得到随机产生包含6个由数字和字符组成的字符串
//存储验证码
Session["VerificationCode"] = _verificationText.ToUpper();//把字符转化成对应的大写字母,储存在Session对象的VerificationCode变量中
//Session 对象用于存储关于用户的信息,或者为一个用户的 session 更改设置。存储于 session 对象中的变量存有单一用户的信息,并且对于应用程序中的所有页面都是可用的。存储于 session 对象中的信息通常是 name、id 以及参数。服务器会为每个新的用户创建一个新的 Session,并在 session 到期时撤销掉这个 Session 对象。
Font _font = new Font("Arial", , FontStyle.Bold);
Bitmap _image = new Bitmap(_width, _height);
Graphics _g = Graphics.FromImage(_image);//从指定的 Image 创建新的 Graphics。
//清空背景色
_g.Clear(Color.White);
//绘制验证码
_verificationTextSize = _g.MeasureString(_verificationText, _font);//测量用指定的 _font 绘制的指定字符串_verificationText。
_g.DrawString(_verificationText, _font, _brush, (_width - _verificationTextSize.Width) / , (_height - _verificationTextSize.Height) / );
_image.Save(Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将该 Image 保存到指定的文件或流。
return null;
} public ActionResult Login() {
return View();
}
}
}

10.打开UserControl.cs,在public ActionResult Register()上点右键添加视图,选强类型视图,模型类选择UserRegister,新建好Register.cshtml视图

Register.cshtml代码

@model RegisterExample.Models.UserRegister

@{
ViewBag.Title = "用户注册";
Layout = "~/Views/Shared/_Layout.cshtml";
} @using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<div class="form">
<dl>
<dt>用户注册</dt>
<dd>
<div class="label">@Html.LabelFor(model => model.UserName):</div>
<div class="ctrl">
@Html.EditorFor(model => model.UserName)
@Html.ValidationMessageFor(model => model.UserName)
@Html.DisplayDescriptionFor(model => model.UserName)
</div>
</dd>
<dd>
<div class="label">@Html.LabelFor(model => model.Gender):</div>
<div class="ctrl">
@Html.RadioButton("Gender", ) 男 @Html.RadioButton("Gender", ) 女 @Html.RadioButton("Gender", , true) 保密
@Html.ValidationMessageFor(model => model)
@Html.DisplayDescriptionFor(model => model)
</div>
</dd>
<dd>
<div class="label">@Html.LabelFor(model => model.Password):</div>
<div class="ctrl">
@Html.PasswordFor(model => model.Password)
@Html.ValidationMessageFor(model => model.Password)
@Html.DisplayDescriptionFor(model => model.Password)
</div>
</dd>
<dd>
<div class="label">@Html.LabelFor(model => model.ConfirmPassword):</div>
<div class="ctrl">
@Html.PasswordFor(model => model.ConfirmPassword)
@Html.ValidationMessageFor(model => model.ConfirmPassword)
@Html.DisplayDescriptionFor(model => model.ConfirmPassword)
</div>
</dd>
<dd>
<div class="label">@Html.LabelFor(model => model.SecurityQuestion):</div>
<div class="ctrl">
@Html.EditorFor(model => model.SecurityQuestion)
@Html.ValidationMessageFor(model => model.SecurityQuestion)
@Html.DisplayDescriptionFor(model => model.SecurityQuestion)
</div>
</dd>
<dd>
<div class="label">@Html.LabelFor(model => model.SecurityAnswer):</div>
<div class="ctrl">
@Html.EditorFor(model => model.SecurityAnswer)
@Html.ValidationMessageFor(model => model.SecurityAnswer)
@Html.DisplayDescriptionFor(model => model.SecurityAnswer)
</div>
</dd>
<dd>
<div class="label">@Html.LabelFor(model => model.Email):</div>
<div class="ctrl">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
@Html.DisplayDescriptionFor(model => model.Email)
</div>
</dd>
<dd>
<div class="label">验证码:</div>
<div class="ctrl">
@Html.TextBoxFor(model => model.VerificationCode)
@Html.ValidationMessageFor(model => model.VerificationCode)
<img id="verificationcode" alt="" src="@Url.Action("VerificationCode", "User")" />
<a id="trydifferent" style="cursor:pointer">换一张</a>
</div>
</dd>
<dd>
<div class="label">注册条款:</div>
<div class="ctrl">
@Html.CheckBox("Agreement", new { @class = "required" })
我已阅读并同意注册条款
</div>
</dd>
<dd>
<div class="label"></div>
<div class="ctrl">
<input type="submit" value="注册" />
</div>
</dd>
</dl>
<div class="clear"></div>
</div>
}
<script type="text/javascript">
$("#trydifferent").click(function () {
//alert(1);
$("#verificationcode").attr("src", "/User/VerificationCode?" + new Date());
}) </script>

11.下面开始写注册处理的代码。在Controllers,在public ActionResult Register(){return View();}下面添加一个[HttpPost]方式的Register() Action。

已在前面的UserControl写好

12.新建提示类:Model/Prompts.cs

namespace RegisterExample.Models
{
/// <summary>
/// 提醒注意
/// </summary>
public class Notice
{
/// <summary>
/// 标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 详细内容
/// </summary>
public string Details { get; set; }
/// <summary>
/// 停留时间【-1-不启用】
/// </summary>
public int DwellTime { get; set; }
/// <summary>
/// 导航名称
/// </summary>
public string NavigationName { get; set; }
/// <summary>
/// 导航地址
/// </summary>
public string NavigationUrl { get; set; }
}
/// <summary>
/// 错误
/// </summary>
public class Error
{
/// <summary>
/// 名称
/// </summary>
public string Title { get; set; }
/// <summary>
/// 详细
/// </summary>
public string Details { get; set; }
/// <summary>
/// 原因
/// </summary>
public string Cause { get; set; }
/// <summary>
/// 解决方法
/// </summary>
public string Solution { get; set; }
} }

13.新建控制器:PromptControl,创建一个Notice方法,还有相对应的Prompt文件夹和Notice.cshtml视图

Notice.cshtml

@model RegisterExample.Models.Notice

@{
ViewBag.Title = Model.Title;
Layout = "~/Views/Shared/_Layout.cshtml";
} <div>
<dl>
<dt>@Html.DisplayFor(model => model.Title)</dt>
<dd>@Html.DisplayFor(model => model.Details)</dd>
@if (Model.DwellTime >= )
{
<dd>系统将在 <span id="time">@Model.DwellTime </span>秒后跳转登陆页面。如未自动跳转请点击<a href="@Model.NavigationUrl">@Model.NavigationName</a>。</dd> <script type="text/javascript">
function Jump(time) {
//alert(1);
window.setTimeout(function () {
time--;
$("#time").text(time);
if (time > ) Jump(time);
else location.href = "@Model.NavigationUrl";
}, );
}
Jump(@Model.DwellTime);
</script>
}
</dl>
</div>

14.创建本地连接的数据库,在Web.config中添加数据库信息:

  <connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=RegisterExample;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\RegisterExample.mdf" providerName="System.Data.SqlClient" />
</connectionStrings>

15.已经在UserControl创建一个Login方法,现还要有与之对应的视图:User/Login.cshtml

@{
ViewBag.Title = "用户登录";
Layout = "~/Views/Shared/_Layout.cshtml";
} <!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Login</title>
</head>
<body>
<div>
<h2>欢迎来到登录页面</h2>
</div>
</body>
</html>

16.运行成功,结束。

(二)学习MVC之实现用户注册功能的更多相关文章

  1. .NET MVC 4 实现用户注册功能

    初学MVC,踩了不少坑,所以通过实现一个用户注册功能把近段时间学习到的知识梳理一遍,方便以后改进和查阅. 问题清单: l 为什么EF自动生成的表名后自动添加了s? l 如何为数据库初始化一些数据? l ...

  2. 白话学习MVC(八)Action的执行二

    一.概述 上篇博文<白话学习MVC(七)Action的执行一>介绍了ASP.NET MVC中Action的执行的简要流程,并且对TempData的运行机制进行了详细的分析,本篇来分析上一篇 ...

  3. 白话学习MVC(十)View的呈现二

    本节将接着<白话学习MVC(九)View的呈现一>来继续对ViewResult的详细执行过程进行分析! 9.ViewResult ViewResult将视图页的内容响应给客户端! 由于Vi ...

  4. 学习MVC之租房网站(二)-框架搭建及准备工作

    在上一篇<学习MVC之租房网站(一)-项目概况>中,确定了UI+Service的“双层”架构,并据此建立了项目 接下来要编写Common类库.配置AdminWeb和FrontWeb 一.编 ...

  5. 学习MVC之租房网站(十二)-缓存和静态页面

    在上一篇<学习MVC之租房网站(十一)-定时任务和云存储>学习了Quartz的使用.发邮件,并将通过UEditor上传的图片保存到云存储.在项目的最后,再学习优化网站性能的一些技术:缓存和 ...

  6. Asp.Net MVC页面静态化功能实现二:用递归算法来实现

    上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...

  7. 白话学习MVC(九)View的呈现一

    一.概述 本节来看一下ASP.NET MVC[View的呈现]的内容,View的呈现是在Action执行之后进行,Action的执行生成一个ActionResult,[View的呈现]的功能就是:通过 ...

  8. 白话学习MVC(七)Action的执行一

    一.概述 在此系列开篇的时候介绍了MVC的生命周期 , 对于请求的处理,都是将相应的类的方法注册到HttpApplication事件中,通过事件的依次执行从而完成对请求的处理.对于MVC来说,请求是先 ...

  9. Web---创建Servlet的3种方式、简单的用户注册功能

    说明: 创建Servlet的方式,在上篇博客中,已经用了方式1(实现Servlet接口),接下来本节讲的是另外2种方式. 上篇博客地址:http://blog.csdn.net/qq_26525215 ...

随机推荐

  1. ^M的前世今生

    ^M 是ascii中的'\r', 回车符,是16进制的0x0D,8进制的015,十进制的13. 回想计算机发展,旧的打字机使用两个字符来开始一个新行.首先是一个字符命令使打印头移回开始位置(回车),然 ...

  2. Java中的IO流系统详解

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  3. UILabel 根据内容的多少来计算label的frame

    self.label.text = @"...."; 计算 frame 的最新方法 //1.设置lable最大显示行数 self.label.numberOfLines = 0; ...

  4. MoonWarriors-lua——《雷电战机》游戏-Lua移植版

    MoonWarriors是一个使用Cocos2d-Html5引擎开发的类似雷电战机的游戏Demo,源代码发布在Cocos2d-x官网的引擎示例当中.MoonWarriors-lua是为了学习Cocos ...

  5. 浅谈JavaSccript函数与对象

    函数 解剖函数 function One(leve1 , leve2){ //code return leve1+leve2 } 注释: 形参不需要加上类型: return语句为可选,没有return ...

  6. SSL与TLS的区别以及介绍

    转载 :http://kb.cnblogs.com/page/197396/ SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议 ...

  7. JVM内存区域模型

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆” ,"perm",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共 ...

  8. HDFS 的可靠性

    HDFS 的可靠性主要有一下几点: 冗余副本策略 机架策略 心跳机制 安全模式 效验和 回收站 元数据保护 快照机制 1.冗余副本策略 可以在hdfs-site.xml中设置复制因子指定副本数量 所有 ...

  9. Ubuntu的挂起和休眠

    Ubuntu的挂起和休眠 之前一直没关注过这方面的信息,因为以前只是在台式机上面用Ubuntu,笔记本一直都是Windows.随着Windows越来越傻冒,最近决定将常用系统转为Ubuntu,才注意到 ...

  10. uva 10739

    dp 只有三个操作  当str[i] != str[j] 时 dp(i, j) = min(dp(i+1, j), dp(i+1, j-1), dp(i, j-1)) #include <ios ...