ASP.NET Identity教程二:(用户管理)2
4. 编辑用户
编辑用户是指根据用户的唯一 Id 值获取某单个用户的信息,然后在页面上将需要修改的字段值显示在可编辑的控件中,供用户修改使用。
4.1. 编写 EditUserViewModel
在“ViewModels”文件夹中添加一个名称为“EditUserViewModel”的类,然后编写如
下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace jsdhh2.ViewModels
{
public class EditUserViewModel
{
[Display(Name = "用户名")]
public string UserName { get; set; }
[Display(Name = "电话(手机/固话)")]
[Phone]
public string PhoneNumber { get; set; }
[Required]
[EmailAddress]
[Display(Name = "电子邮件")]
public string Email { get; set; }
#region 添加字段
[Display(Name = "微信")]
public virtual string WX { get; set; }
public virtual string QQ { get; set; }
[Display(Name = "创建时间")]
public virtual DateTime CreateTime { get; set; }
[Display(Name = "部门ID")]
public virtual int? DepartmentId { get; set; }
[Display(Name = "地址")]
public virtual string Address { get; set; }
[Display(Name = "性别")]
public virtual int? Gender { get; set; }
[Display(Name = "生日")]
public virtual DateTime? BirthDate { get; set; }
[Display(Name = "出生时间")]
public virtual string TheHour { get; set; }
[Display(Name = "详细生日")]
public virtual DateTime? DetailedTime { get; set; }
[Display(Name = "真实姓名")]
public virtual string RealName { get; set; }
[Display(Name = "配偶ID")]
public virtual int? SpouseId { get; set; }
[Display(Name = "头像")]
public virtual string HeaderPic { get; set; }
#endregion
}
}
这里没有关于密码的属性,密码一般情况下会单独做成一个页面,用于在用户丢失密码的情况下修改。这里只修改用户的基本信息。
4.2. 编写 Edit 方法
在 UserController 控制器中添加一个带有 HttpGet 特性的 Edit()方法,用于呈现编辑用户的表单信息视图。再添加一个带有 HttpPost 特性的 Edit()方法,用于提交修改后的用户信息到数据库中。完整的代码如下:
[HttpGet]
public ActionResult Edit(string id)
{
if (string.IsNullOrWhiteSpace(id))
{
return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest);
}
User user = UserManager.FindById(id);
if (user == null)
{
return HttpNotFound();
}
var editUserViewModel = new EditUserViewModel()
{
Email = user.Email,
PhoneNumber = user.PhoneNumber,
WX=user.WX,
QQ=user.QQ,
DepartmentId=user.DepartmentId,
Address=user.Address,
Gender= user.Gender,
RealName=user.RealName,
SpouseId=user.SpouseId,
HeaderPic=user.HeaderPic,
BirthDate=user.BirthDate,
TheHour=user.TheHour,
DetailedTime=user.DetailedTime
};
return View(editUserViewModel);
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(string id, EditUserViewModel editUserViewModel)
{
if (ModelState.IsValid && !string.IsNullOrEmpty(id))
{
User user = UserManager.FindById(id);
user.Email = editUserViewModel.Email;
user.PhoneNumber = editUserViewModel.PhoneNumber;
user.WX = editUserViewModel.WX;
user.QQ = editUserViewModel.QQ;
user.DepartmentId = editUserViewModel.DepartmentId;
user.Address = editUserViewModel.Address;
user.Gender = editUserViewModel.Gender;
user.RealName = editUserViewModel.RealName;
user.SpouseId = editUserViewModel.SpouseId;
user.HeaderPic = editUserViewModel.HeaderPic;
user.BirthDate = editUserViewModel.BirthDate;
user.TheHour = editUserViewModel.TheHour;
user.DetailedTime = editUserViewModel.DetailedTime;
var result = await UserManager.UpdateAsync(user);
if (result.Succeeded)
{
return RedirectToAction("List", "User");
}
AddErrors(result);
}
return View(editUserViewModel);
}
这里使用了 UserManager 类中的 UpdateAsync()异步方法来更新一个用户信息。在执行更新时,首先要获取要更新的 User 对象,然后再在此对象上修改其中的属性值。
4。3. 编辑 Edit 视图
”项目的“Views”“User”中添加一个名称为“Edit”的视图
“Edit.cshtml”视图中编写如下代码:注意,我加入了一个laydate日历控件,感觉好方便,很好用,这个作者技术大牛呀。laydate官网http://www.layui.com/laydate/
@model jsdhh2.ViewModels.EditUserViewModel
@{
ViewBag.Title = "Edit";
}
@using (Html.BeginForm("Edit", "User", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
<h4>编辑用户资料。</h4>
<hr />
<div class="form-group">
<a class="btn btn-primary" href="/User/List">返回</a>
<a class="btn btn-success" href="/User/List">上传头像</a>
<a class="btn btn-warning" href="/User/List">配偶</a>
<a class="btn btn-primary" href="/User/List">修改密码</a>
</div>
<div class="form-group">
<img src="@Model.HeaderPic" class = "col-md-2 control-label" />
</div>
<div class="form-group">
@Html.LabelFor(m => m.RealName, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.RealName, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.PhoneNumber, new { @class = "col-md-2 control-label" })
<div class="col-md-10">@* *@
@Html.TextBoxFor(m => m.PhoneNumber, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.BirthDate, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
<input type="datetime" class="laydate-icon" id="demo" value=@Model.BirthDate name="BirthDate"/>
@*@Html.TextBoxFor(m => m.BirthDate, "{0:yyyy-MM-dd HH:mm:ss}", new { @class = "laydate-icon", id = "demo" })*@
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.TheHour, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.DropDownListFor(m => m.TheHour, new List<SelectListItem>()
{
new SelectListItem() { Text= "23点-凌晨1点", Value = "子时" },
new SelectListItem() { Text= "凌晨1点-3点", Value = "丑时" },
new SelectListItem() { Text= "凌晨3点-5点", Value = "寅时" },
new SelectListItem() { Text= "凌晨5点-7点", Value = "卯时" },
new SelectListItem() { Text= "7点-9点", Value = "辰时" },
new SelectListItem() { Text= "9点-11点", Value = "巳时" },
new SelectListItem() { Text= "午11点-13点", Value = "午时" },
new SelectListItem() { Text= "13点-15点", Value = "未时" },
new SelectListItem() { Text= "15点-17点", Value = "申时" },
new SelectListItem() { Text= "17点-19点", Value = "酉时" },
new SelectListItem() { Text= "19点-21点", Value = "戌时" },
new SelectListItem() { Text= "21点-23点", Value = "亥时" },
})
@*@Html.TextBoxFor(m => m.TheHour, new { @class = "form-control" })*@
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.QQ, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.QQ, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.WX, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.WX, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Address, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Address, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Address, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.Address, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.DepartmentId, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.TextBoxFor(m => m.DepartmentId, new { @class = "form-control" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(m => m.Gender, new { @class = "col-md-2 control-label" })
<div class="col-md-10">
@Html.DropDownListFor(m => m.Gender, new List<SelectListItem>()
{
new SelectListItem() { Text= "男", Value = "1" },
new SelectListItem() { Text= "女", Value = "2" },
})
@*@Html.TextBoxFor(m => m.Gender, new { @class = "form-control" })*@
</div>
</div>
@Html.ValidationSummary("", new { @class = "text-danger" })
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" class="btn btn-default" value="提交" />
</div>
</div>
}
<script src="~/Content/laydate/laydate.js"></script>
<script>
; !function () {
//laydate.skin('molv');
laydate({
elem: '#demo',
istime: true,
format: 'YYYY-MM-DD hh:mm:ss'
})
}();
</script>
注意,这里不必用input来弄日期控件,textbox不行。
注意这里的下拉菜单。因为我当时坑爹的当性别设为int?,如是男是1,女是2.可这个下拉是string的,所以在后台得进行转换。
if (ModelState.IsValid && !string.IsNullOrEmpty(id))
{
User user = UserManager.FindById(id);
var _intGender = Convert.ToInt32(editUserViewModel.Gender);
user.Email = editUserViewModel.Email;
user.PhoneNumber = editUserViewModel.PhoneNumber;
user.WX = editUserViewModel.WX;
user.QQ = editUserViewModel.QQ;
user.DepartmentId = editUserViewModel.DepartmentId;
user.Address = editUserViewModel.Address;
user.Gender =_intGender;
user.RealName = editUserViewModel.RealName;
user.SpouseId = editUserViewModel.SpouseId;
user.BirthDate = editUserViewModel.BirthDate;
user.TheHour = editUserViewModel.TheHour;
var result = await UserManager.UpdateAsync(user);
if (result.Succeeded)
{
下面我得将时辰的下拉也做好,这样就帖上完整 的Edit的代码
浙公网安备 33010602011771号