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

news/2024/5/16 9:40:56/文章来源:https://blog.csdn.net/weixin_33998125/article/details/85607351

在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上。今天做修改资料和修改密码,TryUpdateModel是新用到的东西。

目录:

ASP.NET MVC5 网站开发实践 - 概述

ASP.NET MVC5 网站开发实践(一) - 项目框架

ASP.NET MVC5 网站开发实践(一) - 框架(续) 模型、数据存储、业务逻辑

ASP.NET MVC5 网站开发实践(二) - 用户部分(1)用户注册

ASP.NET MVC5 网站开发实践(二) - 用户部分(2)用户登录、注销

现完善昨天的登录代码:

image

 

一、用户导航菜单

这个就是侧栏的导航,以后所有控制器中action名都为Menu。目标效果如下:

image

先UserController添加Menu action。直接返回分布视图。右键添加视图

<div class="panel panel-primary"><div class="panel-heading"><h3>我的资料</h3></div><div class="panel-body"><ul class="nav nav-pills nav-stacked"><li> <a href="@Url.Action("Details")"><span class="glyphicon glyphicon-user"> 修改资料</span></a></li><li> <a href="@Url.Action("ChangePassword")"><span class="glyphicon glyphicon-log-out"> 修改密码</span></a></li><li> <a href="@Url.Action("Logout")"><span class="glyphicon glyphicon-log-out"> 退出登录</span></a></li></ul></div>
</div>

二、显示用户资料

再在User控制器里添加显示用户资料的action Details。以后约定所有显示详细资料的动作名都为Details。在控制器中返回当前用户的资料

/// <summary>/// 显示资料/// </summary>/// <returns></returns>public ActionResult Details(){return View(userService.Find(User.Identity.Name));}

右键添加视图

@model Ninesky.Models.User@{ViewBag.Title = "我的资料";
}<div class="row"><div class="col-md-3 col-sm-4">@Html.Action("Menu")</div><div class="col-md-9 col-sm-8"><ol class="breadcrumb"><li><span class="glyphicon glyphicon-home"><a> 会员中心</a></span></li><li><a> 个人中心</a></li><li>修改资料</li></ol>@using (Html.BeginForm("Modify","User")){@Html.AntiForgeryToken()<div class="form-horizontal"><h4>用户资料</h4><hr />@Html.ValidationSummary(true)@Html.HiddenFor(model => model.UserID)<div class="form-group">@Html.LabelFor(model => model.UserName, new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.DisplayFor(model => model.UserName)</div></div><div class="form-group">@Html.LabelFor(model => model.DisplayName, new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.DisplayName)@Html.ValidationMessageFor(model => model.DisplayName)</div></div><div class="form-group"><label class = "control-label col-md-2">用户组</label><div class="col-md-10">@foreach (var _relation in Model.UserRoleRelations){ <span>@_relation.Role.Name</span><br />}</div></div><div class="form-group">@Html.LabelFor(model => model.Email, new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.Email)@Html.ValidationMessageFor(model => model.Email)</div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><input type="submit" value="修改" class="btn btn-default" /></div></div></div>}</div>
</div>
@section Scripts {@Scripts.Render("~/bundles/jqueryval")
}
@foreach ( var _relation in Model.UserRoleRelations){ <span>@_relation.Role.Name</span><br />} 这里是显示用户组名称,延迟加载。

image

 

三、修改用户资料

显示用户资料后点击修改直接向后台提交数据,这里把接受并更新数据库的动作名也是Details。在这个方法里不能直接用User做方法参数,因为我只想跟新显示名和邮箱,我如果设置User类型的参数,如果用户向服务器提交的参数中含有UserName,可能用户名都会改掉,这里使用TryUpdateModel来部分更新模型。

/// <summary>/// 修改资料/// </summary>/// <returns></returns>
        [ValidateAntiForgeryToken][HttpPost]public ActionResult Modify(){var _user = userService.Find(User.Identity.Name);if (_user == null) ModelState.AddModelError("", "用户不存在");else{if (TryUpdateModel(_user, new string[] { "DisplayName", "Email" })){if (ModelState.IsValid){if (userService.Update(_user)) ModelState.AddModelError("", "修改成功!");else ModelState.AddModelError("", "无需要修改的资料");}}else ModelState.AddModelError("", "更新模型数据失败");}return View("Details", _user);}
代码中的TryUpdateModel(_user, new string[] { "DisplayName", "Email" }) 表示我只想从客户提交的数据中更新DisplayName和Email

 

四、修改密码

先建立一个视图模型ChangePasswordViewModel

using System.ComponentModel.DataAnnotations;namespace Ninesky.Web.Areas.Member.Models
{/// <summary>/// 修改密码视图模型/// <remarks>创建:2014.02.19</remarks>/// </summary>public class ChangePasswordViewModel{/// <summary>/// 原密码/// </summary>[Required(ErrorMessage = "必填")][Display(Name = "密码")][StringLength(20, MinimumLength = 6, ErrorMessage = "{2}到{1}个字符")][DataType(DataType.Password)]public string OriginalPassword { get; set; }/// <summary>/// 新密码/// </summary>[Required(ErrorMessage = "必填")][Display(Name = "新密码")][StringLength(20, MinimumLength = 6, ErrorMessage = "{2}到{1}个字符")][DataType(DataType.Password)]public string Password { get; set; }/// <summary>/// 确认密码/// </summary>[Required(ErrorMessage = "必填")][Compare("Password", ErrorMessage = "两次输入的密码不一致")][Display(Name = "确认密码")][DataType(DataType.Password)]public string ConfirmPassword { get; set; }}
}

然后在UserController中添加动作public ActionResult ChangePassword() 直接返一个视图。右键添加ChangePasswordViewModel类型的视图

@model Ninesky.Web.Areas.Member.Models.ChangePasswordViewModel@{ViewBag.Title = "修改密码";
}
<div class="row"><div class="col-md-3 col-sm-4">@Html.Action("Menu")</div><div class="col-md-9 col-sm-8"><ol class="breadcrumb"><li><span class="glyphicon glyphicon-home"><a> 会员中心</a></span></li><li><a> 个人中心</a></li><li>修改密码</li></ol>@using (Html.BeginForm()){@Html.AntiForgeryToken()<div class="form-horizontal"><h4>修改密码</h4><hr />@Html.ValidationSummary(true)<div class="form-group">@Html.LabelFor(model => model.OriginalPassword, new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.OriginalPassword)@Html.ValidationMessageFor(model => model.OriginalPassword)</div></div><div class="form-group">@Html.LabelFor(model => model.Password, new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.Password)@Html.ValidationMessageFor(model => model.Password)</div></div><div class="form-group">@Html.LabelFor(model => model.ConfirmPassword, new { @class = "control-label col-md-2" })<div class="col-md-10">@Html.EditorFor(model => model.ConfirmPassword)@Html.ValidationMessageFor(model => model.ConfirmPassword)</div></div><div class="form-group"><div class="col-md-offset-2 col-md-10"><input type="submit" value="修改" class="btn btn-default" /></div></div></div>}@section Scripts {@Scripts.Render("~/bundles/jqueryval")}</div>
</div>

在添加一个接受处理动作,代码也很简单

[ValidateAntiForgeryToken][HttpPost]public ActionResult ChangePassword(ChangePasswordViewModel passwordViewModel){if(ModelState.IsValid){var _user = userService.Find(User.Identity.Name);if (_user.Password == Common.Security.Sha256(passwordViewModel.OriginalPassword)){_user.Password = Common.Security.Sha256(passwordViewModel.Password);if (userService.Update(_user)) ModelState.AddModelError("", "修改密码成功");else ModelState.AddModelError("", "修改密码失败");}else ModelState.AddModelError("", "原密码错误");}return View(passwordViewModel);}

五、在首页显示登录、注册链接

在Web的Shared文件件添加LoginPartial.cshtml视图文件,在用户未登录时显示登录和注册链接,登录后显示用户名。

@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{using (Html.BeginForm("Logout", "User", FormMethod.Post, new { id = "logoutForm", @class = "navbar-right" })){@Html.AntiForgeryToken()<ul class="nav navbar-nav navbar-right"><li>@Html.ActionLink("你好 " + User.Identity.GetUserName() + "!", "Manage", "Account", routeValues: null, htmlAttributes: new { title = "管理" })</li><li><a href="javascript:document.getElementById('logoutForm').submit()">注销</a></li></ul>}
}
else
{<ul class="nav navbar-nav navbar-right"><li>@Html.ActionLink("注册", "Register", "User", routeValues: new { Area = "Member" }, htmlAttributes: new { id = "registerLink" })</li><li>@Html.ActionLink("登录", "Login", "User", routeValues: new {Area="Member"}, htmlAttributes: new { id = "loginLink" })</li></ul>
}

效果如下:

登录前 image 

登陆后image

 

ok.现在我们可以给给member区域的UserController控制器和Homecontroller加上[Authorize]特性。并为Usercontroller的注册 登录 验证码action 加上[AllowAnonymous]特性。

六、总结

修改资料部分用到了部分更新模型方法TryUpdateModel。

到此member区域的用户部分暂时结束。下次开始内容部分。

===================

代码 Ninesky二.3.rar http://pan.baidu.com/s/1pJ6TBmV

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

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

相关文章

给理工男女的一个神奇网站

十一长假已经只剩下最后两天&#xff0c;你给自己定下的假期学习计划进展如何&#xff1f; 你是在家&#xff0c;还是在想家&#xff0c;还是在其他国家&#xff1f; 为了让家里蹲的诸位不虚度光阴&#xff0c;也为了让那些堵在高速路上的童鞋打发时间&#xff0c;现隆重给大…

想做一个显示全国火车运行图的网站(5)误操作

误操作&#xff0c;想把火车站基本信息和wiki信息分到两张表中&#xff0c;在复制坐标列时忘记把数据也导过来就删除了源表的列&#xff0c;丢了所有的地标数据。 找备份&#xff0c;本来有一个作业是三天备份一次数据库的&#xff0c;但是今天一看&#xff0c;忘记在Sql Serve…

IE11兼容性问题——网站提示“打印插件只支持IE浏览器”

很多系统已经自动升级到IE11&#xff0c;会出现兼容性问题——网站提示“打印插件只支持IE浏览器”解决方法&#xff1a;浏览器“工具”——“兼容性视图设置”&#xff0c;打开以下窗口将相关网址添加到列表中&#xff0c;点击“关闭”&#xff0c;刷新网页即可打印。转载于:h…

LVS-DR+Keepalived网站服务器双机热备配置

keepalived是一个类似于layer3, 4 & 7交换机制的软件&#xff0c;也就是我们平时说的第3层、第4层和第7层交换。Keepalived是自动完成&#xff0c;不需人工干涉。调度服务器&#xff1a;需要在LVS的基础上面做。参考上两节&#xff1a;负载均衡群集之一LVS-DR&#xff1a;h…

演练:使用多种编程语言开发网站

演练&#xff1a;使用多种编程语言开发网站默认情况下&#xff0c;App_Code 文件夹不允许使用多种编程语言。不过&#xff0c;您可以将 Web 应用程序结构和配置设置修改为支持多种编程语言&#xff0c;如 Visual Basic 和 C#。这样&#xff0c;ASP.NET 就可以创建多个程序集&am…

网站的高性能架构---应用服务器性能优化

应用服务器就是处理网站业务的服务器&#xff0c;网站的业务代码都部署在这里&#xff0c;是网站开发最复杂&#xff0c;变化最多的地方&#xff0c;优化手段主要有缓存、集群和异步等。 分布式缓存缓存无处不在&#xff0c;既存在于浏览器、也存在于服务器和数据库&#xff1b…

LAMP学习之linux下论坛网站搭建及测试

LAMP环境下论坛的搭建安装mysql过程 http://zhibing.blog.51cto.com/846805/192930安装apachePHP过程http://zhibing.blog.51cto.com/846805/194124首先下载一个论坛程序&#xff0c;本文以PHPWind为例安装过程详解[rootzhibing ]#mkdir /usr/local/apache/htdocs/bbs //在A…

推荐一个激动人心的Silverlight网站应用

先给出围观地址&#xff1a;http://www.vsallaccess.com/index.html 该网站不仅外表华丽&#xff0c;而且使用了很多silverlight3的新特性&#xff08;如3d变换&#xff0c;导航等&#xff09;&#xff0c;绝对会让踌躇不前的silverlighter们振奋起来 左侧菜单中鼠标滑过时的绚…

1月第3周网络安全报告:被篡改的.COM网站占74.3%

IDC评述网&#xff08;idcps.com&#xff09;01月26日报道&#xff1a;根据CNCERT抽样监测结果和国家信息安全漏洞共享平台&#xff08;CNVD&#xff09;发布的数据得悉&#xff0c;在1月第3周&#xff08;2016-01-11至2016-01-17&#xff09;期间&#xff0c;我国互联网网络安…

一个简单的监控网站是否正常并自动重启服务的shell脚本

为什么80%的码农都做不了架构师&#xff1f;>>> #!/bin/sh if [ -z "curl --connect-timeout 15 --max-time 20 --head --silent http://localhost/index.php|head -n 1|grep 200" ];thenecho -e "$(date %Y-%m-%d)\n" killall nginxkillall p…

黄聪:Discuz!的SEO优化策略一:如何设置标题 如何去掉Powered by Discuz!尾巴

1、如何设置标题 进入 管理中心 -- 全局 -- SEO设置 -- 论坛 -- 标题 &#xff0c;设置你的网站标题和描述。 PS&#xff1a;有人问keywords要不要设置&#xff0c;其实现在keywords对SEO的影响已经微乎其微了&#xff0c;添不添加都可以。 2、去掉Powered by Discuz!尾巴 1&am…

开发者必去的10大国内网站推荐

1、dev666网址导航 dev666网址导航是非盈利无广告、为开发者量身定制的网址导航&#xff0c;整体界面纯净无广告&#xff0c;开发者常用的网站一触即达&#xff0c;主要模块包括&#xff1a;『名站导航』、『开放平台』、『站长资源』、『编程开发』、『教程文档』、『PM创业』…

如何查询你网站空间的提供商

当你在网上冲浪的时候&#xff0c;你会发现某些网站流量很大但速度奇快&#xff0c;如果你证准备想购买空间&#xff0c;你肯定会想知道这个网站空间提供商是谁呢&#xff1f;除了网站管理员留言或写信之外&#xff0c;你还可以通过下面这个工具自己去找出网站后面的空间提供商…

学校比赛网站设计

这个是一个比较的一个临时比赛网站&#xff0c;之前是老师让一个在金山实习的室友弄&#xff0c;但是他在那边实习没有时间&#xff0c;就让我这个在这个学校准备考研的我来进行尝试下。实现起来很简单&#xff0c;之前没怎么弄实际的开发&#xff0c;现在弄起来发现实际开发出…

带给你灵感的20个漂亮的单页网站设计作品

单页网站是指只有一个页面的网站&#xff0c;这种形式的网站曾经非常流行&#xff0c;现在依然有很多人喜欢。不过&#xff0c;并不是每个网站都适合做成单页&#xff0c;一般都是内容比较少而且将来内容也不怎么增加的情况才适合这样做。如果你打算做一个这样的网站&#xff0…

【转载】windows使用nginx实现网站负载均衡测试实例

windows使用nginx实现网站负载均衡测试实例 最近正在研究Nginx&#xff0c;Nginx作为反向代理服务器&#xff0c;可以对Web服务器提供加速&#xff0c;并且具有负载均衡的功能。 首先我要在官网下载Nginx&#xff08;http://nginx.org/en/download.html&#xff09;&#xff0…

网站的高可用架构 Availability

可用性度量和考核 度量 用多少个9来表示&#xff0c;表示一年中可用时间的百分比 考核 可以用如下的表&#xff1a; 故障分故障时间&#xff08;分钟&#xff09; * 权重。 计入考核 高可用的网站架构 分层架构&#xff0c;每一层都分布式部署。使用冗余和故障转移的方式保证可…

通过云服务器搭建自己网站,通过云服务器搭建自己网站

通过云服务器搭建自己网站 内容精选换一换Discuz!论坛是全球成熟度最高、覆盖率最大的论坛软件系统之一。用户对论坛的访问可分为高峰期和平峰期&#xff0c;若论坛采用多服务器部署模式且满足高峰时期的负载需求&#xff0c;平峰期必有部分服务器处于闲置状态&#xff0c;增加…

Apsara Clouder云计算专项技能认证:网站建设-简单动态网站搭建

一.课程介绍 1.课程目标 了解静态网站和动态网站的区别掌握动态网站的不同实现方式在阿里云上如何搭建 wordPress网站以及 wordPress 网站的管理和优化二.网站搭建的类型 1.网站的主要类型 静态网站:指全部由 HTML 代码格式页面组成的网站,所有内容包含在网页文件中,主要用到的…