(四)学习MVC之修改个人资料和身份验证登陆
1.修改资料不用建立模型,直接在UserControl.cs添加 ChangeInfo():
#region 修改用户资料
[UserAuthorize]
public ActionResult ChangeInfo()
{
userRsy = new UserRepository();
var _user = userRsy.Find(UserName);
return View(_user);
}
[HttpPost]
[UserAuthorize]
public ActionResult ChangeInfo(User user)
{
userRsy = new UserRepository();
if (userRsy.Authentication(UserName, ModifyPasswordExample.Common.Text.Sha256(user.Password)) == )
{
var _user = userRsy.Find(UserName);
_user.Gender = user.Gender;
_user.Email = user.Email;
_user.QQ = user.QQ;
_user.Tel = user.Tel;
_user.Address = user.Address;
_user.PostCode = user.PostCode;
if (userRsy.Update(_user))
{
Notice _n = new Notice { Title = "修改资料成功", Details = "您已经成功修改资料!", DwellTime = , NavigationName = "用户首页", NavigationUrl = Url.Action("Default", "User") };
return RedirectToAction("UserNotice", "Prompt", _n);
}
else
{
Error _e = new Error { Title = "修改资料失败", Details = "在修改用户资料时时,更新的资料未能保存到数据库", Cause = "系统错误", Solution = Server.UrlEncode("<li>返回<a href='" + Url.Action("ChangeInfo", "User") + "'>修改资料</a>页面,输入正确的信息后重新操作</li><li>联系网站管理员</li>") };
return RedirectToAction("UserError", "Prompt", _e);
}
}
else
{
ModelState.AddModelError("Password", "密码错误!");
return View();
} }
#endregion
2.其中[UserAuthorize]特性是[Authorize]的重写,在Extensions/UserAuthorizeAttribute.cs。使用方式是直接在方法上面加这个特性就可以了。
重写后[UserAuthorize]的作用是用户权限认证,比如说直接在浏览器直接输入修改资料的Url,但是由于没有进行身份验证,需要先转到某个指定的页面,身份验证成功后自动回到修改资料的页面,在转到某个指定页面时,会将指定页面之前的Url一起传递过去,这样成功验证后就可以通过传递的Url到达指定页面前的页面。[UserAuthorize]配合的语句一般有这一句:Request.QueryString["ReturnUrl"] != null) return Redirect(Request.QueryString["ReturnUrl"]
using ModifyPasswordExample.Repository; namespace System.Web.Mvc
{
/// <summary>
/// 用户权限验证
/// </summary>
public class UserAuthorizeAttribute :AuthorizeAttribute
{
/// <summary>
/// 核心【验证用户是否登陆】
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
//检查Cookies["User"]是否存在
if (httpContext.Request.Cookies["User"] == null) return false;
//验证用户名密码是否正确
HttpCookie _cookie = httpContext.Request.Cookies["User"];
string _userName = _cookie["UserName"];
string _password = _cookie["Password"];
if (_userName == "" || _password == "") return false;
UserRepository _userRsy = new UserRepository();
if (_userRsy.Authentication(_userName, _password) == ) return true;
else return false;
}
}
}
WebConfig配置中的<authentication >标签起到指定某个特定页面的作用。这里的指定页面是/User/Login
<authentication mode="Forms">
<forms loginUrl="~/User/Login" timeout="" />
</authentication>
3.之前有使用UserControl的Default方法及相对应的视图,现重新修改,代码如下:
方法:
#region 用户中心默认页面
/// <summary>
/// 用户中心默认页面
/// </summary>
/// <returns></returns>
[UserAuthorize] //有加这个特性的方法将会先转到某个特定页面,这里是登录页面。和WebConfig的<authentication>标签一起使用。
public ActionResult Default()
{
userRsy = new UserRepository();
var _user = userRsy.Find(UserName);
return View(_user);
} #endregion
视图:
@model ModifyPasswordExample.Models.User @{
ViewBag.Title = "首页";
Layout = "~/Views/Shared/_User.cshtml";
} <div class="leftnav">
<div class="Nav">
@*您现在的位置: 用户首页*@
@Html.Partial("PartialPersonalNav")
</div>
<div>
@Model.UserName
<br />
@Model.GroupId
</div>
</div>
Shared/_User.cshtml是一个布局视图:
<!DOCTYPE html> <html>
<head>
<meta name="viewport" content="width=device-width" />
<title>@ViewBag.Title-用户中心</title>
@Styles.Render("~/Content/css")
@Styles.Render("~/Content/themes/base/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render(" ~/bundles/jqueryui")
@Scripts.Render("~/bundles/jqueryval") </head>
<body>
<div class="header">
<div class="info"></div>
<div class="menubar">
<a href="@Context @Url.Action("Default", "User")">用户管理</a><a href="@Url.Action("UserDefault", "Article")">文章管理</a>
</div>
</div>
<div class="wrapper">
@RenderBody()
</div>
<div class="footer"></div>
</body>
<script type="text/javascript">
$(".menubar a").button();
$(document).ready(function () {
var _vwheight = $(document).height() - $(".header").height() - $(".footer").height();//可视的工作区域高度
var _lheight = $(".left").height();
var _wheight = $(".workspace").height();
if (_vwheight < _lheight) _vwheight = _lheight;
if (_vwheight < _wheight) _vwheight = _vwheight;
$(".workspace").height(_vwheight);
$(".left").height(_vwheight)
});
/*按钮*/
</script>
</html>
4.现在要把左侧导航列表做出来,在视图的User文件夹上点右键新建局部视图PartialPersonalNav:
<ul>
<li>@Html.ActionLink("用户首页","Default","User")</li>
<li>@Html.ActionLink("修改信息","ChangeInfo","User")</li>
<li>@Html.ActionLink("修改密码","ChangePassword","User")</li>
<li>@Html.ActionLink("退出系统","Logout","User")</li>
</ul>
将default.cshtml中“这里左侧导航列表”替换为@Html.Partial("PartialPersonalNav")。
5.创建ChangeInfo的强类型视图,视图:
@model ModifyPasswordExample.Models.User @{
ViewBag.Title = "修改个人资料";
Layout = "~/Views/Shared/_User.cshtml";
} <div class="leftnav">@Html.Partial("PartialPersonalNav")</div>
<div class="workspace">
<div class="Nav">您现在的位置: 用户首页</div>
<div>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true) <fieldset>
<legend>修改资料</legend>
@Html.HiddenFor(model => model.UserId)
<ul>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.DisplayFor(model => model.UserName)
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.Password)
</div>
<div class="editor-field">
@Html.Password("Password")
@Html.ValidationMessageFor(model => model.Password)
输入正确的密码才能修改资料。
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.Gender)
</div>
<div class="editor-field">
@Html.RadioButtonFor(model => model.Gender, ) 男
@Html.RadioButtonFor(model => model.Gender, ) 女
@Html.RadioButtonFor(model => model.Gender, ) 保密
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.Email)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Email)
@Html.ValidationMessageFor(model => model.Email)
@Html.DisplayDescriptionFor(model => model.Email)
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.QQ)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.QQ)
@Html.ValidationMessageFor(model => model.QQ)
@Html.DisplayDescriptionFor(model => model.QQ)
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.Tel)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Tel)
@Html.ValidationMessageFor(model => model.Tel)
@Html.DisplayDescriptionFor(model => model.Tel)
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.Address)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Address)
@Html.ValidationMessageFor(model => model.Address)
@Html.DisplayDescriptionFor(model => model.Address)
</div>
</li>
<li>
<div class="editor-label">
@Html.LabelFor(model => model.PostCode)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.PostCode)
@Html.ValidationMessageFor(model => model.PostCode)
@Html.DisplayDescriptionFor(model => model.PostCode)
</div>
</li>
<li><input type="submit" value="修改" /></li>
</ul>
</fieldset>
}
</div>
</div>
6.运行程序,修改资料正常运行。
(四)学习MVC之修改个人资料和身份验证登陆的更多相关文章
- ASP.NET MVC 随想录——探索ASP.NET Identity 身份验证和基于角色的授权,中级篇
在前一篇文章中,我介绍了ASP.NET Identity 基本API的运用并创建了若干用户账号.那么在本篇文章中,我将继续ASP.NET Identity 之旅,向您展示如何运用ASP.NET Ide ...
- ASP.NET MVC 5 学习教程:修改视图和布局页
原文 ASP.NET MVC 5 学习教程:修改视图和布局页 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...
- 学习MVC之租房网站(四)-实现Service层并进行单元测试
在上一篇<学习MVC之租房网站(三)-编写Eneity类并创建数据库>中,记录了编写Eneity类并采用CodeFirst的方式创建数据库的过程,接下来就到了Service层的实现了,并且 ...
- 学习MVC之租房网站(八)- 前台注册和登录
在上一篇<学习MVC之租房网站(七)-房源管理和配图上传>完成了在后台新增.编辑房源信息以及上传房源配图的功能.到此后台开发便告一段落了,开始实现前台的功能,也是从用户的登录.注册开始. ...
- 15天学习MVC后的小结(分享经历与想法)
学习MVC已经有半个月,看了看日历,刚好半个月.分享了好几篇练习的博文:一,<创建第一个MVC应用程序> http://www.cnblogs.com/insus/p/3358560.ht ...
- 学习MVC之租房网站(五)-权限、角色、用户管理
在上一篇<学习MVC之租房网站(四)-实现Service层并进行单元测试>中,记录了实现Service层并进行单元测试的过程,接下来该到"正题"-MVC了,也就是UI层 ...
- 学习MVC之租房网站(九)-房源显示和搜索
在上一篇<学习MVC之租房网站(八)- 前台注册和登录>完成了前台用户的注册.登录.重置密码等功能,然后要实现与业务相关的功能,包括房源的显示.检索等. 一 房源显示 房源显示内容较多,涉 ...
- 学习MVC之租房网站(十)-预约和跟单
在上一篇<学习MVC之租房网站(九)-房源显示和搜索>完成了房源的显示.检索,然后是用户的预约看房,以及后台操作员对预约看房的跟单操作. 预约看房仅有将预约信息保存到对应表的操作,预约表有 ...
- 四、MVC简介
一.高内聚.低耦合 大学的时候,上过一门叫<软件工程>的课程,课程中讲到了耦合,解耦等相关的词汇,当时很懵懂,不解其意. 耦合:是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影 ...
随机推荐
- 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java
前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...
- Kinetic使用注意点--group
new Group(config) 参数: config:包含所有配置项的对象. { x: "横坐标", y: "纵坐标", width: "宽度&q ...
- Could not retrieve mirrorlist http://mirrorlist.centos.org || PYCURL ERROR 6
yum:Could not retrieve mirrorlist http://mirrorlist.centos.org || PYCURL ERROR 6 通过centos安装openldap的 ...
- MongoDB安装,启动,注册为windows系统服务
MongoDB安装与启动 周建旭 2014-08-10 解压完后配置环境变量 下载Windows 32-bit或64-bit版本并解压缩,程序文件都在bin目录中,其它两个目录分别是C++调用是的头文 ...
- MBProgressHUD ---
1,MBProgressHUD常用属性和用法Demo - (void)testMBProgressHUD { NSLog(@"test MBProgressHUD "); /* 要 ...
- 使用Compass制作雪碧图
遇见好的文章,笔者也会转载.但是正所谓好记性不如烂笔头,单纯的拿来主义也不如自己的亲自实践.所以每次需要转载的文章,我都会自己敲一遍,中间加入一些自己的思考. 这篇文章转载自:http://www.h ...
- bzoj 3637: Query on a tree VI 树链剖分 && AC600
3637: Query on a tree VI Time Limit: 8 Sec Memory Limit: 1024 MBSubmit: 206 Solved: 38[Submit][Sta ...
- hdu 1272
并查集 要判断这个图是连通的 就是只有一个父节点 #include <cstdio> #include <cstring> #define maxn 100005 int f ...
- 8 行 Node.js 代码实现代理服务器
接触 Node.js 已有多年,一直喜欢它的单线程模型和异步IO特性,以及 JavaScript 语言本身的灵活性.同时,JavaScript 前后端通吃,在全栈开发领域具有独特的优势.今天就来看看作 ...
- <span> <div> 局部 keydown ,keyup事件。页面部分div $(document) 无效,可能焦点,添加焦点。
前天改一个bug, js 实现的一个 面板拖拉,左右各两个列表,中间面板画线连接,页面左侧列表选中后,key 事件无效.右侧选中确有效,很奇怪,查看源码,左侧选中后,$(document).on(&q ...