欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MVC4制作网站教程第二章 部分用户功能实现代码

程序员文章站 2023-12-04 22:03:28
用户部分要实现的功能有: 序  一、用户  1.1  1.2 1.3  1.4 要实现这些目的首先新建用户(mod...

用户部分要实现的功能有:
序 
一、用户 
1.1 
1.2
1.3 
1.4

要实现这些目的首先新建用户(model)模型

/// <summary>
 /// 用户模型
 /// </summary>
 public class user
 {
 [key]
 public int userid { get; set; }
 /// <summary>
 /// 用户组id
 /// </summary>
 [display(name="用户组id")]
 [required(errormessage = "×")]
 public int groupid { get; set; }
 /// <summary>
 /// 用户名
 /// </summary>
 [display(name="用户名",description="4-20个字符。")]
 [required(errormessage = "×")]
 [stringlength(20, minimumlength = 4, errormessage = "×")]
 public string username { get; set; }
 /// <summary>
 /// 密码
 /// </summary>
 [required]
 [stringlength(256)]
 public string password { get; set; }
 /// <summary>
 /// 性别【0-男;1-女;2-保密】
 /// </summary>
 [display(name="性别")]
 [required(errormessage = "×")]
 [range(0,2,errormessage = "×")]
 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(20, minimumlength = 4, errormessage = "×")]
 public string securityquestion { get; set; }
 /// <summary>
 /// 密保答案
 /// </summary>
 [display(name="密保答案",description="请认真填写,忘记密码后回答正确才能找回密码。2-20个字符。")]
 [required(errormessage = "×")]
 [stringlength(20, minimumlength = 2, errormessage = "×")]
 public string securityanswer { get; set; }
 /// <summary>
 /// qq号码
 /// </summary>
 [display(name="qq号码")]
 [regularexpression("^[1-9][0-9]{4-13]$",errormessage = "×")]
 [stringlength(12, minimumlength = 6, 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(80, errormessage = "×")]
 public string address { get; set; }
 /// <summary>
 /// 邮编
 /// </summary>
 [display(name="邮编")]
 [regularexpression("^[0-9]{6}$",errormessage = "×")]
 public string postcode { get; set; }
 /// <summary>
 /// 注册时间
 /// </summary>
 public datetime? regtime { get; set; }
 /// <summary>
 /// 上次登录时间
 /// </summary>
 public datetime? lastlogintime { get; set; }

 /// <summary>
 /// 用户组
 /// </summary>
 public virtual usergroup group { get; set; }
 } 

下面添加用户controller。在controller文件夹点右键 选择新建控制器名称输入usercontroller,完成后生成代码如下: 

using system.web.mvc;
using cms.models;

namespace cms.controllers
{
 public class usercontroller : controller
 {

 public actionresult register()
 {
 return view();
 }

 //
 // post: /user/create

 [httppost]
 public actionresult register(userregister uerreg)
 {
 try
 {
 // todo: add insert logic here

 return redirecttoaction("index");
 }
 catch
 {
 return view();
 }
 }
 }
} 

马上涉及的问题就是数据的存取,本来准备用repository模式做,后来觉得用repository模式在一个人写个简单那网站的情况下意义不大,写起来反而有点啰嗦,干脆用伪repository模式写。项目中新建repository文件夹。在文件夹中新建类cms,用来实现ef的context。代码如下: 

using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.data.entity;
using cms.models;

namespace cms.repository
{
 public class cmscontext:dbcontext
 {
 public dbset<user> users { get; set; }
 }
} 

简单吧。再建一个类repositorybase,用来做***repository的基类,里面写add,update,delete,find几个虚函数,方便在继承类里面这几个函数的名称统一。 

using system;
using system.collections.generic;
using system.linq;
using system.web;

namespace cms.repository
{
 public class repositorybase<tmodel>
 {
 private cmscontext dbcontext;
 public repositorybase()
 {
 dbcontext = new cmscontext();
 }
 /// <summary>
 /// 添加【继承类重写后才能正常使用】
 /// </summary>
 public virtual bool add(tmodel tmodel) { return false; }
 /// <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();
 }
 }
 }
} 

可以写userrepository的具体实现了,新建userrepository类。重写add,update方法后代码如下: 

using system;
using system.collections.generic;
using system.linq;
using system.web;
using cms.models;

namespace cms.repository
{
 public class userrepository:repositorybase<user>
 {
 private cmscontext dbcontext;
 public userrepository()
 {
 dbcontext = new cmscontext();
 }
 /// <summary>
 /// 添加用户
 /// </summary>
 /// <param name="user">用户信息</param>
 /// <returns></returns>
 public override bool add(user user)
 {
 if (user == null) return false;
 dbcontext.users.add(user);
 if (dbcontext.savechanges() > 0) return true;
 else return false;
 }
 /// <summary>
 /// 更新用户信息
 /// </summary>
 /// <param name="user"></param>
 /// <returns></returns>
 public override bool update(user user)
 {
 var _user = dbcontext.users.singleordefault(u => u.userid == user.userid);
 if (_user == null) return false;
 _user = user;
 if (dbcontext.savechanges() > 0) return true;
 else return false;
 }
 //public override 
 }
} 

到这里repository的基本模式也出来了,现在mvc中的m和c都出来了就差v了,少了v相当于高富帅少了“富”在高,再帅都没用。那么马上下手为了写view做准备。 
@html.label可以用来显示字段的display(name=“”),@html.displaytext显示模型中字段值。没有找到用来显示模型中字段的display(……,description=“”)属性的htmlhelper。先自己写一个用。在项目中新建extensions文件夹,右键添加类displaydescriptionextensions,在生成的代码中将命名空间改为system.web.mvc.html,添加两个静态方法displaydescription和displaydescriptionfor。完成后代码 :

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);
 }
 }
} 

好了,在视图中就可以直接用@html.displaydescriptionfor(model => model.username)或@html.displaydescription(“.username”)调用描述信息了. 

到了这里后,大致的准备工作差不多了,还有两个小东东实现一下就可以写具体功能了。 

第一个小东东:验证码。验证码分两块一是随机获取一定位数的字符,另一块是把字符绘制成图片。 

在项目中添加common 文件夹,在文件夹中新建text类,在类实现函数verificationtext()利用random获取指定长度的随机字符串,写完后的代码: 

using system;

namespace cms.common
{
 /// <summary>
 /// 文本相关
 /// </summary>
 public class text
 {
 /// <summary>
 /// 获取验证码【字符串】
 /// </summary>
 /// <param name="length">验证码长度【必须大于0】</param>
 /// <returns></returns>
 public static string verificationtext(int length)
 {
 char[] _verification = new char[length];
 random _random = new random();
 char[] _dictionary = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
 for (int i = 0; i < length; i++)
 {
 _verification[i] = _dictionary[_random.next(_dictionary.length - 1)];
 }
 return new string(_verification);
 }
 }
} 

现在可以绘制验证码了,这里会用到.net的gdi+,我看了很多朋友写的验证码,一般都绘制了很多干扰点和干扰线,目的是为了使验证码不容易被电脑,个人觉得把绘制字的时候用材质刷绘制应该也能达到目的,所以找了一幅水彩画的材质。 

MVC4制作网站教程第二章 部分用户功能实现代码

用这个做字的材质也应该不太容易别识别吧,开始写绘图的代码,在usercontroller里新建名为verificationcode的action,代码如下: 

/// <summary>
 /// 绘制验证码
 /// </summary>
 /// <returns></returns>
 public actionresult verificationcode()
 {
 int _verificationlength = 6;
 int _width = 100, _height = 20;
 sizef _verificationtextsize;
 bitmap _bitmap = new bitmap(server.mappath("~/skins/common/texture.jpg"),true);
 texturebrush _brush = new texturebrush(_bitmap);
 //获取验证码
 string _verificationtext = common.text.verificationtext(_verificationlength);
 //存储验证码
 session["verificationcode"] = _verificationtext.toupper();
 font _font = new font("arial", 14, fontstyle.bold);
 bitmap _image = new bitmap(_width, _height);
 graphics _g = graphics.fromimage(_image);
 //清空背景色
 _g.clear(color.white);
 //绘制验证码
 _verificationtextsize = _g.measurestring(_verificationtext, _font);
 _g.drawstring(_verificationtext,_font,_brush,(_width-_verificationtextsize.width)/2,(_height-_verificationtextsize.height)/2);
 _image.save(response.outputstream, system.drawing.imaging.imageformat.jpeg);
 return null;
 } 

打开浏览器看下效果MVC4制作网站教程第二章 部分用户功能实现代码还不错。到此准备工作完成。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。