ASP.NET MVC5网站开发之添加\删除\重置密码\修改密码\列表浏览管理员篇2(六)

一、安装插件。

展示层前端框架以Bootstrap为主,因为Bootstrap的js功能较弱,这里添加一些插件作补充。其实很多js插件可以通过NuGet安装,只是NuGet安装时添加的内容较多,不如自己复制来的干净,所以这里所有的插件都是下载然后复制到项目中。

1、Bootstrap 3 Datepicker 4.17.37
网址:https://eonasdan.github.io/bootstrap-datetimepicker/

下载并解压压缩包->将bootstrap-datetimepicker.js和bootstrap-datetimepicker.min.js复制到Ninesy.Web项目的Scripts文件夹,将bootstrap-datetimepicker.css和bootstrap-datetimepicker.min.css复制到Content文件夹。

2、bootstrap-dialog 3.3.4.1 
网址:https://github.com/nakupanda/bootstrap3-dialog

下载并解压压缩包->将.js复制到Ninesy.Web项目的Scripts文件夹,将.css复制到Content文件夹。

3、bootstrap-select  1.10.0
网址:http://silviomoreto.github.io/bootstrap-select/

下载并解压压缩包->将bootstrap-select.js复制到Ninesy.Web项目的Scripts文件夹,和defaults-zh_CN.js重命名为bootstrap-select-zh_CN.js复制到Ninesy.Web项目的Scripts文件夹,将bootstrap-select.css、bootstrap-select.css.map和bootstrap-select.min.css复制到Content文件夹。

4、bootstrap-table 1.10.1

网址:http://bootstrap-table.wenzhixin.net.cn/
下载并解压压缩包->将bootstrap-table.js和bootstrap-table-zh-CN.js复制到Ninesy.Web项目的Scripts文件夹,将bootstrap-table.css复制到Content文件夹。

5、Bootstrap TreeView 1.2.0 

网址:https://github.com/jonmiles/bootstrap-treeview

下载并解压压缩包->将bootstrap-treeview.js复制到Ninesy.Web项目的Scripts文件夹,将bootstrap-treeview.css复制到Content文件夹。

6、twbs-pagination
网址:http://esimakin.github.io/twbs-pagination/

下载并解压压缩包->将jquery.twbsPagination.js和jquery.twbsPagination.min.js复制到Ninesy.Web项目的Scripts文件夹。

7、对js和css进行捆绑和压缩
打开Ninesky.Web->App_Start->BundleConfig.cs。添加红框内的代码。

二、获取ModelState错误信息的方法
在项目中有些内容是通过AJAX方法提交,如果提交时客户端没有进行验证,在服务器端进行验证时会将错误信息保存在ModelState中,这里需要写一个方法来获取ModelState的错误信息,以便反馈给客户端。

1、Ninesk.Web【右键】->添加->类,输入类名General。
 引用命名空间using System.Web.Mvc和System.Text。
 添加静态方法GetModelErrorString(),该方法用来获取模型的错误字符串。

using System.Linq;
using System.Text;
using System.Web.Mvc;

namespace Ninesky.Web
{
 /// <summary>
 /// 通用类
 /// </summary>
 public class General
 {
 /// <summary>
 /// 获取模型错误
 /// </summary>
 /// <param name="modelState">模型状态</param>
 /// <returns></returns>
 public static string GetModelErrorString(ModelStateDictionary modelState)
 {
 StringBuilder _sb = new StringBuilder();
 var _ErrorModelState = modelState.Where(m => m.Value.Errors.Count() > 0);
 foreach(var item in _ErrorModelState)
 {
 foreach (var modelError in item.Value.Errors)
 {
 _sb.AppendLine(modelError.ErrorMessage);
 }
 }
 return _sb.ToString();
 }
 }
}

三、完善布局页
 上次完成了管理员登录,这次要进行登录后的一些功能,要先把后台的布局页充实起来。 
打开 Ninesky.Web/Areas/Control/Views/_Layout.cshtml。整成下面的代码。自己渣一样的美工,具体过程就不写了。

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>@ViewBag.Title - 系统管理</title>
 @Styles.Render("~/Content//controlcss")
 @RenderSection("style", required: false)
 @Scripts.Render("~/bundles/modernizr")
 @Scripts.Render("~/bundles/jquery")
 @Scripts.Render("~/bundles/bootstrap")
 @RenderSection("scripts", required: false)
</head>
<body>
 <div class="navbar navbar-default navbar-fixed-top">
 <div class="container">
 <div class="navbar-header">
 <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
 <span class="icon-bar"></span>
 <span class="icon-bar"></span>
 <span class="icon-bar"></span>
 </button>
 @Html.ActionLink("NINESKY 系统管理", "Index", "Home", new { area = "Control" }, new { @class = "navbar-brand" })
 </div>
 <div class="navbar-collapse collapse">
 <ul class="nav navbar-nav">
 <li><a><span class="glyphicon glyphicon-user"></span> 用户管理</a></li>
 <li><a href="@Url.Action("Index","Admin")"><span class='glyphicon glyphicon-lock'></span> 管理员</a></li>
 <li><a><span class="glyphicon glyphicon-list"></span> 栏目设置</a></li>
 <li><a><span class="glyphicon glyphicon-cog"></span> 网站设置</a></li>
 </ul>
 <ul class="nav navbar-nav navbar-right">
 <li>
 <a href="@Url.Action("MyInfo","Admin")"><span class="glyphicon glyphicon-envelope"></span> @Context.Session["Accounts"].ToString()</a>

 </li>
 <li>
 <a href="@Url.Action("Logout","Admin")"><span class="glyphicon glyphicon-log-out"></span> 退出</a>
 </li>
 </ul>
 </div>
 </div>
 </div>

 <div class="container body-content">
 <div class="row">
 <div class="col-lg-3 col-md-3 col-sm-4">@RenderSection("SideNav", false)</div>
 <div class="col-lg-9 col-md-9 col-sm-8">@RenderBody()</div>
 </div>
 <hr />
 <footer class="navbar navbar-fixed-bottom text-center bg-primary ">
 <p>© Ninesky v0.1 BASE BY 洞庭夕照 http://mzwhj.cnblogs.com</p>
 </footer>
 </div>
</body>
</html>

反正效果就是这个样子了。

三、功能实现
按照设想,要在Index界面完成管理员的浏览、添加和删除功能。这些功能采用ajax方式。
在添加AdminController的时候自动添加了Index()方法。

添加Index视图

在Index方法上右键添加视图

@{
 ViewBag.Title = "管理员";
}

<ol class="breadcrumb">
 <li><span class="glyphicon glyphicon-home"></span> @Html.ActionLink("首页", "Index", "Home")</li>
 <li class="active">@Html.ActionLink("管理员", "Index", "Admin")</li>
</ol>

@section style{
 @Styles.Render("~/Content/bootstrapplugincss")
}

@section scripts{
 @Scripts.Render("~/bundles/jqueryval")
 @Scripts.Render("~/bundles/bootstrapplugin")

}

添加侧栏导航视图
Ninesky.Web/Areas/Control/Views/Admin【右键】->添加->视图

视图代码如下

<div class="panel panel-default">
 <div class="panel-heading">
 <div class="panel-title"><span class="glyphicon glyphicon-lock"></span> 管理员</div>
 </div>
 <div class="panel-body">
 <div class="list-group">
 <div class="list-group-item"><span class="glyphicon glyphicon-list"></span> @Html.ActionLink("管理","Index")</div>
 </div>
 </div>
</div>

在Index视图中添加@section SideNav{@Html.Partial("SideNavPartialView")}(如图)

1、管理员列表
 在Admin控制器中添加ListJson()方法

/// <summary>
 /// 管理员列表
 /// </summary>
 /// <returns></returns>
 public JsonResult ListJson()
 {
 return Json(adminManager.FindList());
 }

为在index中使用bootstrap-table显示和操作管理员列表,在index视图中添加下图代码。

<div id="toolbar" class="btn-group" role="group">
 <button id="btn_add" class="btn btn-default"><span class="glyphicon glyphicon-plus"></span> 添加</button>
 <button id="btn_del" class="btn btn-default"><span class="glyphicon glyphicon-remove"></span> 删除</button>
</div>
<table id="admingrid"></table>

在@section scripts{ } 中添加js代码

<script type="text/javascript">

 $(document).ready(function () {

 //表格
 var $table = $('#admingrid');
 $table.bootstrapTable({
 toolbar: "#toolbar",
 showRefresh: true,
 showColumns: true,
 showFooter: true,
 method: "post",
 url: "@Url.Action("ListJson")",
 columns: [
 { title: "state", checkbox: true },
 { title: "ID", field: "AdministratorID" },
 { title: "帐号", field: "Accounts" },
 { title: "登录时间", field: "LoginTime", formatter: function (value) { return moment(value).format("YYYY-MM-DD HH:mm:ss") } },
 { title: "登录IP", field: "LoginIP" },
 { title: "创建时间", field: "CreateTime", formatter: function (value) { return moment(value).format("YYYY-MM-DD HH:mm:ss") } },
 { title: "操作", field: "AdministratorID", formatter: function (value, row, index) { return "<a href=\"javascript:void(0)\" onclick=\"ResetPassword(" + value + ",'" + row.Accounts + "')\">重置密码</a>" } }
 ]
 });
 //表格结束
 });
 </script>
}

显示效果如图:

2、添加管理员
 在控制器中添加AddPartialView()方法

/// <summary>
 /// 添加【分部视图】
 /// </summary>
 /// <returns></returns>
 public PartialViewResult AddPartialView()
 {
 return PartialView();
 }

Models文件夹【右键】->添加->类,输入类名 AddAdminViewModel。

using System.ComponentModel.DataAnnotations;

namespace Ninesky.Web.Areas.Control.Models
{
 /// <summary>
 /// 添加管理员模型
 /// </summary>
 public class AddAdminViewModel
 {
 /// <summary>
 /// 帐号
 /// </summary>
 [Required(ErrorMessage = "必须输入{0}")]
 [StringLength(30, MinimumLength = 4, ErrorMessage = "{0}长度为{2}-{1}个字符")]
 [Display(Name = "帐号")]
 public string Accounts { get; set; }

 /// <summary>
 /// 密码
 /// </summary>
 [DataType(DataType.Password)] [Required(ErrorMessage = "必须输入{0}")]
 [StringLength(20,MinimumLength =6, ErrorMessage = "{0}长度少于{1}个字符")]
 [Display(Name = "密码")]
 public string Password { get; set; }
 }
}

右键添加视图

注意:抓图的时候忘记勾上引用脚本库了就抓了,记得勾上。

@model Ninesky.Web.Areas.Control.Models.AddAdminViewModel

@using (Html.BeginForm())
{
 @Html.AntiForgeryToken()

 <div class="form-horizontal">
 @Html.ValidationSummary(true, "", new { @class = "text-danger" })
 <div class="form-group">
 @Html.LabelFor(model => model.Accounts, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.EditorFor(model => model.Accounts, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Accounts, "", new { @class = "text-danger" })
 </div>
 </div>

 <div class="form-group">
 @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
 </div>
 </div>

 </div>
}
@Scripts.Render("~/bundles/jqueryval")

在Index视图 script脚本区域,“//表格结束”后面添加js代码

//表格结束
 //工具栏
 //添加按钮
 $("#btn_add").click(function () {
 var addDialog = new BootstrapDialog({
 title: "<span class='glyphicon glyphicon-plus'></span>添加管理员",
 message: function (dialog) {
 var $message = $('<div></div>');
 var pageToLoad = dialog.getData('pageToLoad');
 $message.load(pageToLoad);

 return $message;
 },
 data: {
 'pageToLoad': '@Url.Action("AddPartialView")'
 },
 buttons: [{
 icon: "glyphicon glyphicon-plus",
 label: "添加",
 action: function (dialogItself) {
 $.post($("form").attr("action"), $("form").serializeArray(), function (data) {
 if (data.Code == 1) {
  BootstrapDialog.show({
  message: data.Message,
  buttons: [{
  icon: "glyphicon glyphicon-ok",
  label: "确定",
  action: function (dialogItself) {
  $table.bootstrapTable("refresh");
  dialogItself.close();
  addDialog.close();
  }
  }]

  });
 }
 else BootstrapDialog.alert(data.Message);
 }, "json");
 $("form").validate();
 }
 }, {
 icon: "glyphicon glyphicon-remove",
 label: "关闭",
 action: function (dialogItself) {
 dialogItself.close();
 }
 }]
 });
 addDialog.open();
 });
 //添加按钮结束

3、删除管理员 
考虑到批量删除,上次写AdministratorManager没有写批量删除方法,这次补上。 
打开Ninesky.Core/AdministratorManager.cs, 添加如下代码

/// <summary>
 /// 删除【批量】返回值Code:1-成功,2-部分删除,0-失败
 /// </summary>
 /// <param name="administratorIDList"></param>
 /// <returns></returns>
 public Response Delete(List<int> administratorIDList)
 {
 Response _resp = new Response();
 int _totalDel = administratorIDList.Count;
 int _totalAdmin = Count();
 foreach (int i in administratorIDList)
 {
 if (_totalAdmin > 1)
 {
 base.Repository.Delete(new Administrator() { AdministratorID = i }, false);
 _totalAdmin--;
 }
 else _resp.Message = "最少需保留1名管理员";
 }
 _resp.Data = base.Repository.Save();
 if(_resp.Data == _totalDel)
 {
 _resp.Code = 1;
 _resp.Message = "成功删除" + _resp.Data + "名管理员";
 }
 else if (_resp.Data > 0)
 {
 _resp.Code = 2;
 _resp.Message = "成功删除" + _resp.Data + "名管理员";
 }
 else
 {
 _resp.Code = 0;
 _resp.Message = "删除失败";
 }
 return _resp;
 }

另外要修改一下Ninesky.DataLibrary.Repository的删除public int Delete(T entity, bool isSave)代码将Remove方式 改为Attach,不然会出错。

/// <summary>
 /// 删除实体
 /// </summary>
 /// <param name="entity">实体</param>
 /// <param name="isSave">是否立即保存</param>
 /// <returns>在“isSave”为True时返回受影响的对象的数目,为False时直接返回0</returns>
 public int Delete(T entity, bool isSave)
 {
 DbContext.Set<T>().Attach(entity);
 DbContext.Entry<T>(entity).State = EntityState.Deleted;
 return isSave ? DbContext.SaveChanges() : 0;
 }

打开AdminController 添加DeleteJson(List<int> ids)方法

// <summary>
 /// 删除
 /// Response.Code:1-成功,2-部分删除,0-失败
 /// Response.Data:删除的数量
 /// </summary>
 /// <returns></returns>
 [HttpPost]
 public JsonResult DeleteJson(List<int> ids)
 {
 int _total = ids.Count();
 Response _res = new Core.Types.Response();
 int _currentAdminID = int.Parse(Session["AdminID"].ToString());
 if (ids.Contains(_currentAdminID))
 {
 ids.Remove(_currentAdminID);
 }
 _res = adminManager.Delete(ids);
 if(_res.Code==1&& _res.Data < _total)
 {
 _res.Code = 2;
 _res.Message = "共提交删除"+_total+"名管理员,实际删除"+_res.Data+"名管理员。\n原因:不能删除当前登录的账号";
 }
 else if(_res.Code ==2)
 {
 _res.Message = "共提交删除" + _total + "名管理员,实际删除" + _res.Data + "名管理员。";
 }
 return Json(_res);
 }

在Index视图 script脚本区域,“//添加按钮结束”后面添加删除js代码

//添加按钮结束

 //删除按钮
 $("#btn_del").click(function () {
 var selected = $table.bootstrapTable('getSelections');
 if ($(selected).length > 0) {
 BootstrapDialog.confirm("确定删除选中的" + $(selected).length + "位管理员", function (result) {
 if (result) {
 var ids = new Array($(selected).length);
 $.each(selected, function (index, value) {
 ids[index] = value.AdministratorID;
 });
 $.post("@Url.Action("DeleteJson","Admin")", { ids: ids }, function (data) {
 if (data.Code != 0) {
  BootstrapDialog.show({
  message: data.Message,
  buttons: [{
  icon: "glyphicon glyphicon-ok",
  label: "确定",
  action: function (dialogItself) {
  $table.bootstrapTable("refresh");
  dialogItself.close();
  }
  }]

  });
 }
 else BootstrapDialog.alert(data.Message);

 }, "json");
 }
 });
 }
 else BootstrapDialog.warning("请选择要删除的行");
 });
 //删除按钮结束

4、重置密码
 在AdminController中 添加ResetPassword(int id)方法。方法中将密码重置为Ninesky。

/// <summary>
 /// 重置密码【Ninesky】
 /// </summary>
 /// <param name="id">管理员ID</param>
 /// <returns></returns>
 [HttpPost]
 public JsonResult ResetPassword(int id)
 {
 string _password = "Ninesky";
 Response _resp = adminManager.ChangePassword(id, Security.SHA256(_password));
 if (_resp.Code == 1) _resp.Message = "密码重置为:" + _password;
 return Json(_resp);
 }

在添加script代码中表格代码段可以看到,这里通过 连接的onclick调用ResetPassword方法,所以ResetPassword方法要放在表格生成前面,不然会出现 方法未定义的错误。

这里把代码放到$(document).ready的前面。

<script type="text/javascript"> //重置密码
 function ResetPassword(id, accounts) {
 BootstrapDialog.confirm("确定重置" + accounts + "的密码", function (result) {
 if (result) {
 $.post("@Url.Action("ResetPassword", "Admin")", { id: id }, function (data) {
 BootstrapDialog.alert(data.Message);
 }, "json");
 }
 });
 };
 //重置密码结束

 $(document).ready(function () {

 //表格

5、修改管理员密码 
在在AdminController中 添加MyInfo()方法。

/// <summary>
 /// 我的资料
 /// </summary>
 /// <returns></returns>
 public ActionResult MyInfo()
 {
 return View(adminManager.Find(Session["Accounts"].ToString()));
 }

右键添加视图

@model Ninesky.Core.Administrator

@{
 ViewBag.Title = "我的资料";
}

@section SideNav{@Html.Partial("SideNavPartialView")}

<ol class="breadcrumb">
 <li><span class="glyphicon glyphicon-home"></span> @Html.ActionLink("首页", "Index", "Home")</li>
 <li>@Html.ActionLink("管理员", "Index", "Admin")</li>
 <li class="active">我的资料</li>
</ol>
@Html.Raw(ViewBag.Message)
@using (Html.BeginForm())
{
 @Html.AntiForgeryToken()

 <div class="form-horizontal">
 @Html.ValidationSummary(true, "", new { @class = "text-danger" })

 <div class="form-group">
 @Html.LabelFor(model => model.Accounts, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.DisplayTextFor(model => model.Accounts)

 </div>
 </div>

 <div class="form-group">
 @Html.LabelFor(model => model.Password, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.EditorFor(model => model.Password, new { htmlAttributes = new { @class = "form-control" } })
 @Html.ValidationMessageFor(model => model.Password, "", new { @class = "text-danger" })
 </div>
 </div>

 <div class="form-group">
 @Html.LabelFor(model => model.LoginIP, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.DisplayTextFor(model => model.LoginIP)

 </div>
 </div>

 <div class="form-group">
 @Html.LabelFor(model => model.LoginTime, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.DisplayTextFor(model => model.LoginTime)
 </div>
 </div>

 <div class="form-group">
 @Html.LabelFor(model => model.CreateTime, htmlAttributes: new { @class = "control-label col-md-2" })
 <div class="col-md-10">
 @Html.DisplayTextFor(model => model.CreateTime)
 </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")
}

在在AdminController中 添加处理方法MyInfo(FormCollection form)方法。

[ValidateAntiForgeryToken]
 [HttpPost]
 public ActionResult MyInfo(FormCollection form)
 {
 var _admin = adminManager.Find(Session["Accounts"].ToString());

 if (_admin.Password != form["Password"])
 {
 _admin.Password = Security.SHA256(form["Password"]);
 var _resp = adminManager.ChangePassword(_admin.AdministratorID, _admin.Password);
 if(_resp.Code ==1) ViewBag.Message = "<div class=\"alert alert-success\" role=\"alert\"><span class=\"glyphicon glyphicon-ok\"></span>修改密码成功!</div>";
 else ViewBag.Message = "<div class=\"alert alert-danger\" role=\"alert\"><span class=\"glyphicon glyphicon-remove\"></span>修改密码失败!</div>";
 }
 return View(_admin);
 }

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

管理员功能到此写完。感慨一下:时间太少,熬夜到凌晨真不容易! 
代码见:https://ninesky.codeplex.com/SourceControl/latest
代码下载:https://ninesky.codeplex.com 点击SOURCE CODE 点击Download下载源文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ASP.NET MVC5网站开发用户修改资料和密码(六)

    在上一篇文章网站开发(五)中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 现完善昨天的登录代码: 一.用户导航菜单 这个就是侧栏的导航,以后所有控制器中action名都为Menu.目标效果如下: 先UserController添加Menu action.直接返回分布视图.右键添加视图 <div class="panel panel-primary">

  • Asp.NEt邮箱验证修改密码通过邮箱找回密码功能

    使用邮箱验证修改密码,在这里我是使用163免费邮进行测试 前台代码 <input type="text" name="Mail" id="Mail"/> <span>*请输入邮箱</span><br/> <asp:Button ID="zhuce" runat="server" Text="tijiao" OnClick="

  • ASP.NET MVC5网站开发之添加\删除\重置密码\修改密码\列表浏览管理员篇2(六)

    一.安装插件. 展示层前端框架以Bootstrap为主,因为Bootstrap的js功能较弱,这里添加一些插件作补充.其实很多js插件可以通过NuGet安装,只是NuGet安装时添加的内容较多,不如自己复制来的干净,所以这里所有的插件都是下载然后复制到项目中. 1.Bootstrap 3 Datepicker 4.17.37 网址:https://eonasdan.github.io/bootstrap-datetimepicker/ 下载并解压压缩包->将bootstrap-datetimep

  • ASP.NET MVC5网站开发管理列表、回复及删除(十三)

    一.管理列表 跟上次我的列表相似,直接贴代码了. 首先打开Consultation控制器,添加ManageList方法 /// <summary> /// 咨询管理 /// </summary> /// <returns></returns> public ActionResult ManageList() { return View(); } 添加返回json数据的ManageJsonList public JsonResult ManageJsonLis

  • ASP.NET MVC5网站开发用户注册(四)

    一.默认Web项目的更改 用户这部分还是自己做,所以删除自动生成的用户相关代码. 二.添加Member区域 在web项目上点右键 添加 区域Member. 添加Home控制器,选择MVC5控制器-空 我们给public ActionResult Index()添加一个视图,代码很简单就是显示下用户名 @{ ViewBag.Title = "会员中心"; } <h2>欢迎你!@User.Identity.Name </h2> 我们先运行一下,出错啦. 这是因为项目

  • ASP.NET MVC5网站开发概述(一)

    前段时间一直在用MVC4写个网站开发的demo,由于刚开始学所有的代码都写在一个项目中,越写越混乱,到后来有些代码自己都理不清了.正好看到别人在用MVC5写东西,喜新厌旧的我马上下载了Visual Studio 2013,幸好MVC4到MVC5变化不大,这次准备用MVC5重新写个Demo. 每次看以前写的代码总有把它丢进回收站的冲动,其实没有完美的代码,能解决问题的代码就算是好代码吧,但是我还是决定重新写一个学习的Demo,希望这次能有提高,希望这次能写完吧! 一.开发环境 1.开发环境: Vi

  • ASP.NET MVC5网站开发用户登录、注销(五)

    一.创建ClaimsIdentity ClaimsIdentity(委托基于声明的标识)是在ASP.NET Identity身份认证系统的登录时要用到,我们在UserService中来生成它. 1.打开IBLL项目InterfaceUserService接口,添加接口方法ClaimsIdentity CreateIdentity(User user, string authenticationType); 2.打开BLL项目的UserService类,添加CreateIdentity方法的实现代

  • ASP.NET MVC5网站开发咨询管理的架构(十一)

    一.总体说明 1.实现功能 2.类图 由于文章部分把大部分类都是实现了,这里仅多了一个Consultation类. 二.创建咨询模型类 在Ninesky.Models项目添加类Consultation(咨询模型),该模型跟Article类似都是CommonModel的扩展. 1.添加Consultation类. using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.Models { /// <su

  • ASP.NET MVC5网站开发咨询管理的架构(十一)

    一.总体说明1.实现功能 2.类图 由于文章部分把大部分类都是实现了,这里仅多了一个Consultation类.二.创建咨询模型类在Ninesky.Models项目添加类Consultation(咨询模型),该模型跟Article类似都是CommonModel的扩展.1.添加Consultation类. using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.Models { /// <summar

  • ASP.NET MVC5网站开发之用户资料的修改和删除3(七)

    这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和"Delete". 一.用户资料修改(Modify) 此功能分两个部分: public ActionResult Modify(int id) 用于显示用户信息 [httppost] public ActionResult Modify(FormCollection form)用户就收前台传

  • ASP.NET MVC5网站开发修改及删除文章(十)

    上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 一.删除文章 由于公共模型跟,文章,附件有关联,所以这里的删除次序很重要,如果先删除模型,那么文章ModelID和附件的ModelID多会变成null,所以要先先删除文章和附件再删除公共模型. 由于公共模型和附件是一对多的关系,我们把删除公共模型和删除附件写在一起. 在BLL的BaseRepository类中有默认的De

  • ASP.NET MVC5网站开发之用户角色的后台管理1(七)

    角色是网站中都有的一个功能,用来区分用户的类型.划分用户的权限,这次实现角色列表浏览.角色添加.角色修改和角色删除. 一.业务逻辑层 1.角色模型 Ninesky.Core[右键]->添加->类,输入类名Role. 引用System.ComponentModel.DataAnnotations命名空间 using System.ComponentModel.DataAnnotations; namespace Ninesky.Core { /// <summary> /// 角色

随机推荐