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

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

在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录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

转载于:https://www.cnblogs.com/mzwhj/p/3558576.html

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

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

相关文章

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

根据我的实践经验。如果你在写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;众多大公司也把…

Apache中如何设置网站默认首页

Apache中如何设置网站默认首页方法11111111111111111111111 步骤: 1)打开apache\conf\extra\httpd-vhosts.conf 2)在 VirturalHost标签对中输入DirectoryIndex index.php //index.php即为网站默认首页 <VirtualHost *:80>DocumentRoot D:\www\abcServerName www.abc.…

推荐有关git的一张图片和2个网站

来源&#xff1a;http://roclinux.cn [正文开始] 一张描述git数据迁移的示意图&#xff0c;很清晰&#xff0c;对于理解git的命令很有帮助&#xff0c;转发分享在这里&#xff1a; 另外&#xff0c;有2个git的网站&#xff0c;推荐给大家&#xff1a; 1 gitready&#xff1a;配…

VAST2.0视频广告投放解决方案改变视频网站未来技术格局

转载&#xff1a;http://www.ipinyou.com.cn/UI/technicalnews/201203/VAST2_0.html 日前&#xff0c;国内最领先的人群定向广告技术公司品友互动宣布&#xff0c;正式推出针对视频网站采用VAST 2.0 标准的视频广告投放解决方案。 这是中国第一家采用视频广告VAST 2.0标准的网络…