学用MVC4做网站一:用户

news/2024/5/20 15:12:16/文章来源:https://blog.csdn.net/weixin_30588907/article/details/96986367

用户部分要实现的功能有:

一、用户

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 herereturn 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+,我看了很多朋友写的验证码,一般都绘制了很多干扰点和干扰线,目的是为了使验证码不容易被电脑,个人觉得把绘制字的时候用材质刷绘制应该也能达到目的,所以找了一幅水彩画的材质。

image

用这个做字的材质也应该不太容易别识别吧,开始写绘图的代码,在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;}

 

 

打开浏览器看下效果image还不错。到此准备工作完成。

转载于:https://www.cnblogs.com/mzwhj/archive/2012/10/22/2720089.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_790782.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在线 pdf转html代码,快速建站的免费办法:在线PDF转HTML您得掌握!

代码对于我们这种小白来说简直就是一堆不认识的字母和符号&#xff0c;但是对于专业的程序员来说无疑就是他们的家常便饭。有时候小编还挺羡慕从事这项工作的人们&#xff0c;除了容易掉头发之外这个工作还是很令人尊敬的&#xff0c;毕竟科技越来越发达离不开码农们的奋战一搏…

InstantClick – 快速响应!让你的网站与众不同

尽管网络带宽不断增加&#xff0c;但网站并没有更快很多。这是因为最大的瓶颈在于页面加载的延迟。InstantClick 是一个很小的 JavaScript 库&#xff0c;大大加速你的网站响应速度。  在访问者点击一个链接之前&#xff0c;鼠标会悬停在链接上面&#xff0c;这两个事件之间通…

ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码

在上一篇博客中实现了用户的注销和登录&#xff0c;其实代码里落了点东西&#xff0c;就是用户登录要更新最后一次登录时间和登录IP&#xff0c;这次补上。今天做修改资料和修改密码&#xff0c;TryUpdateModel是新用到的东西。 目录&#xff1a; ASP.NET MVC5 网站开发实践 - …

把这些地方都注意了,你的网站就不会有那么多的兼容问题了

根据我的实践经验。如果你在写HTML/CSS时候是按照W3C推荐的方式写的&#xff0c;那么基本的浏览器兼容问题都是可以避免的。 这里主要考虑是的ie8-,个人目测Ie9的渲染效果已经跟的上主流了。 测试ie兼容最好要在win7上测试&#xff0c;因为winXP最高支持IE8。 这里贴出百度统计…

mini2440 linux内核编译与移植 课程设计,增加引导内核功能 - u-boot-2009.08在mini2440上的移植_Linux编程_Linux公社-Linux系统门户网站...

移植环境1&#xff0c;主机环境&#xff1a;VMare下CentOS 5.5 &#xff0c;1G内存。2&#xff0c;集成开发环境&#xff1a;Elipse IDE3&#xff0c;编译编译环境&#xff1a;arm-linux-gcc v4.4.3&#xff0c;arm-none-eabi-gcc v4.5.1。4&#xff0c;开发板&#xff1a;mini…

优化企业网站的10大策划技巧

随着互联网的高速发展&#xff0c;企业网站建设早已成为企业运营的一种必要手段。企业拥有一个自己的官网是非常重要的&#xff0c;也是一个企业互联网战略的基础。任何一个企业都应该有一个属于自己的网站&#xff0c;这个网站是企业自身进行品牌宣传、客户服务、产品订购的一…

大型网站系统架构演化之路

一个成熟的大型网站&#xff08;如淘宝、天猫、腾讯等&#xff09;的系统架构并不是一开始设计时就具备完整的高性能、高可用、高伸缩等特性的&#xff0c;它是随着用户量的增加&#xff0c;业务功能的扩展逐渐演变完善的&#xff0c;在这个过程中&#xff0c;开发模式、技术架…

通过网站架构图吸取智慧

近段时间以来&#xff0c;通过接触有关海量数据处理和搜索引擎的诸多技术&#xff0c;常常见识到不少精妙绝伦的架构图。除了每每感叹于每幅图表面上的绘制的精细之外&#xff0c;更为架构图背后所隐藏的设计思想所叹服。个人这两天一直在搜集各大型网站的架构设计图&#xff0…

oracle优先站点的原理_青蓝互动:从SEO工作原理中找到搜索引擎背后的技术点

每天我们都要和搜索引擎打交道&#xff0c;搜索引擎就像是一个打分的老师&#xff0c;只有真正了解了搜索引擎&#xff0c;网站的分数才能得到最高。要想在搜索引擎上站稳脚跟&#xff0c;那么我们就需要知道它的四大工作原理——抓取、过滤、收录、排序。一、抓取&#xff1a;…

第5章 scrapy爬取知名问答网站

第五章感觉是第四章的练习项目&#xff0c;无非就是多了一个模拟登录。 不分小节记录了&#xff0c;直接上知识点&#xff0c;可能比较乱。 1.常见的httpcode&#xff1a; 2.怎么找post参数&#xff1f; 先找到登录的页面&#xff0c;打开firebug&#xff0c;输入错误的账号和密…

看完48秒动画,让你不敢再登录HTTP网站(附完整示例代码)

原文转至&#xff1a;http://www.cnblogs.com/baibaomen/p/http-session-hijack.html 在我的 单点登录SSO示例代码 一文中&#xff0c;强烈不建议部署HTTP的SSO服务站点。 在此写个基于网络包嗅探的HTTP会话劫持程序&#xff0c;给大家一个直观的危害性展示。 示例中&#xff0…

阿里云免费SSL数字证书,实现网站Https化

关于http和https不再赘述&#xff0c;参考: https://mp.weixin.qq.downloadcom/s/3NKOCOeIUF2SGJnY7II9hA 说在最前&#xff1a; 在阿里云购买的域名可以免费使用一年免费的SSL证书1. 获取阿里云免费证书方法 https://jingyan.baidu.com/article/6f2f55a17519f1b5b83e6c6b.html…

网站关键词布局设置,这样添加关键词排名很容易上来!

搜索引擎对你站点的识别、抓取、收录等流程都为机器操作&#xff0c;因此他们会识别本文或本站的目标关键词&#xff0c;咱们把这些关键词布局好&#xff0c;很容易会把网站排名给坐上来。为何这么说呢&#xff0c;今天咱们来谈谈网站关键词的布局设置。 拿着本站有排名的一篇文…

jenkins如何构建C#代码写的网站

纯粹是因为同事习惯了写C#代码&#xff0c;开发的网站用C#编译&#xff0c; 对于习惯了用Maven编译的测试人员&#xff0c;真是一头雾水。不用jenkins吧&#xff0c;效率特别低&#xff0c;每次收到开发发过来的版本&#xff0c;还要进行数据库相关配置&#xff0c;是非常累人的…

1080*1920 下看网站很爽

转载于:https://www.cnblogs.com/waynebaby/archive/2009/10/28/1591651.html

[导入]XmlHttp异步获取网站数据的例子

XmlHttp异步获取网站数据的例子文章来源:http://blog.csdn.net/net_lover/archive/2004/07/06/35220.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/07/06/816118.html

Block Site – Chrome™ 网站拦截程序

Block Site – Chrome™ 网站拦截程序 Block Site网站拦截程序的简介Block Site网站拦截程序的功能Block Site网站拦截程序的优点摘要&#xff1a;Block Site 是一款浏览器扩展程序&#xff0c;可让您根据定义的参数拦截特定网站。Block Site 维护和更新一个含有成人内容的已知…

一步步构建大型网站架构

之前我简单向大家介绍了各个知名大型网站的架构&#xff0c;MySpace的五个里程碑、Flickr的架构、YouTube的架构、PlentyOfFish的架构、WikiPedia的架构。这几个都很典型&#xff0c;我们可以从中获取很多有关网站架构方面的知识&#xff0c;看了之后你会发现你原来的想法很可能…

代码编程在线运行网站

目录 菜鸟工具 Dotcpp在线编译 代码测试 代码在线运行工具 在线工具 在线HTML/CSS/JavaScript代码运行工具 菜鸟工具 支持绝大部分语言的在线编译和运行 Dotcpp在线编译 支持的语言较少&#xff0c;有C&#xff0c;C&#xff0c;Java&#xff0c;Python以及PHP。 代码测试…

年度盛宴:2012年最佳25个响应式网站设计作品《上篇》

2012年&#xff0c;响应式网站设计成为主流&#xff0c;这个概念由著名网页设计师 Ethan Marcotte 在2010年5月份提出&#xff0c;其目标是要让设计的网站能够响应用户的行为&#xff0c;根据不同终端设备自动调整尺寸。 响应式设计不再只是一个概念&#xff0c;众多大公司也把…