在本系列文章的第一部分,介绍了如何从零开始创建一个简单的数据库,概述了ASP.NET MVC的基本概念,并展示了如何使用Entity Framework 6构建简单的数据访问,以及在MVC中创建一个简单的注册页面。第二部分讨论了创建基本登录页面以及在MVC应用程序中实现简单的基于角色的页面授权的逐步过程。第三部分讨论了如何使用jQuery和jQuery AJAX在应用程序中执行获取、编辑、更新和删除(FEUD)操作。
如果还没有阅读之前的文章,请参考以下链接:
在本文中,将创建一个页面,允许用户修改他们的个人资料数据。
首先,打开“UserManager”类,并添加以下方法:
public UserProfileView GetUserProfile(int userID) {
UserProfileView UPV = new UserProfileView();
using(DemoDBEntities db = new DemoDBEntities()) {
var user = db.SYSUsers.Find(userID);
if(user != null) {
UPV.SYSUserID = user.SYSUserID;
UPV.LoginName = user.LoginName;
UPV.Password = user.PasswordEncryptedText;
var SUP = db.SYSUserProfiles.Find(userID);
if(SUP != null) {
UPV.FirstName = SUP.FirstName;
UPV.LastName = SUP.LastName;
UPV.Gender = SUP.Gender;
}
var SUR = db.SYSUserRoles.Find(userID);
if(SUR != null) {
UPV.LOOKUPRoleID = SUR.LOOKUPRoleID;
UPV.RoleName = SUR.LOOKUPRole.RoleName;
UPV.IsRoleActive = SUR.IsActive;
}
}
}
return UPV;
}
上述方法通过传递SYSUserID作为参数,从数据库中获取特定用户的信息。可能已经注意到该方法返回UserProfileView类型,它包含来自不同表的一些属性。
现在,打开“HomeController”类并添加以下动作方法:
[Authorize]
public ActionResult EditProfile() {
string loginName = User.Identity.Name;
UserManager UM = new UserManager();
UserProfileView UPV = UM.GetUserProfile(UM.GetUserID(loginName));
return View(UPV);
}
[HttpPost]
[Authorize]
public ActionResult EditProfile(UserProfileView profile) {
if(ModelState.IsValid) {
UserManager UM = new UserManager();
UM.UpdateUserAccount(profile);
ViewBag.Status = "Update Successful!";
}
return View(profile);
}
上面的代码由两个动作方法组成。第一个EditProfile()方法将在页面被请求并加载到浏览器时被调用。它通过调用GetUserProfile()方法并传递SYSUserID作为参数来获取用户资料数据。第二个是重载方法,它将在POST请求期间被调用,即当点击保存按钮时。它首先检查字段的有效性(如果它们有效且不为空),然后调用UpdateUserAccount()方法,并将UserProfileView模型从视图传递到该方法。如果还记得之前的文章系列,UpdateUserAccount()方法是实际将数据保存到数据库的地方。
可能还注意到这两个动作方法都装饰有[Authorize]属性,以确保两种方法只能由经过身份验证的用户访问,无论他们的角色如何。
下一步是为个人资料页面生成视图。要做到这一点,右键单击EditProfile()方法并选择“添加视图”。在“添加视图”对话框中,提供所需的字段,如下图所示:
请注意Model类字段的值。它应该是“UserProfileView”。现在,点击添加以为生成UI。
Visual Studio将根据从模型(UserProfileView)中定义的字段生成所有控件。这意味着它还将生成不想编辑的不必要字段,例如LOOKUPRoleID和IsRoleActive。此外,还需要为显示Gender字段提供一个下拉列表。因此,请确保更新生成的HTML标记。它看起来类似于以下内容:
@model MVC5RealWorld.Models.ViewModel.UserProfileView
@{
ViewBag.Title = "EditProfile";
Layout = "~/Views/Shared/_Layout.cshtml";
}
Edit Your Profile
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
@ViewBag.Status
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.HiddenFor(model => model.SYSUserID)
@Html.LabelFor(model => model.RoleName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DisplayFor(model => model.RoleName)
@Html.ValidationMessageFor(model => model.RoleName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.LoginName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.LoginName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.LoginName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.FirstName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.FirstName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.LastName, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.LastName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.LastName, "", new { @class = "text-danger" })
@Html.LabelFor(model => model.Gender, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownListFor(model => model.Gender, new List {
new SelectListItem { Text = "Male", Value = "M" },
new SelectListItem { Text = "Female", Value = "F" }
}, new { @class = "form-control" })
}
@Html.ActionLink("Back", "Welcome")
上面的标记是一个强类型视图,它根据UserProfileView模型渲染HTML。现在,在“Welcome.cshtml”视图中添加以下标记。
@Html.ActionLink("Edit Profile", "EditProfile", "Home")
上面的标记只是一个链接到EditProfile页面的链接,这样当登录后,可以轻松地导航到个人资料页面并开始修改数据。