您现在的位置是:网站首页> 编程资料编程资料
一步步打造简单的MVC电商网站BooksStore(4)_实用技巧_
2023-05-24
503人已围观
简介 一步步打造简单的MVC电商网站BooksStore(4)_实用技巧_
一步步打造一个简单的 MVC 电商网站 - BooksStore(四)
本系列的 GitHub地址:https://github.com/liqingwen2015/Wen.BooksStore
《一步步打造一个简单的 MVC 电商网站 - BooksStore(一)》
《一步步打造一个简单的 MVC 电商网站 - BooksStore(二)》
《一步步打造一个简单的 MVC 电商网站 - BooksStore(三)》
《一步步打造一个简单的 MVC 电商网站 - BooksStore(四)》
简介
上一节我们完成了两个主要功能:完成了整个购物车的流程,以及订单处理(发邮件进行通知),今天我们来学习一下最基本的增删改查,以及登录认证过滤器,加入防 CSRF 攻击,本系列已完结。
该系列主要功能与知识点如下:
分类、产品浏览、购物车、结算、CRUD(增删改查) 管理、发邮件、分页、模型绑定、认证过滤器和单元测试等。
【备注】项目使用 VS2015 + C#6 进行开发,有问题请发表在留言区哦,还有,页面长得比较丑,请见谅。
目录
基本的增删改查 CRUD
登录授权认证过滤
基本的增删改查 CRUD
我们创建一个新的控制器进行增删改查功能,AdminController,并添加一个显示所有数据的方法:

////// 后台管理控制器 /// public class AdminController : Controller { private readonly IBookRepository _bookRepository; public AdminController(IBookRepository bookRepository) { _bookRepository = bookRepository; } ////// 首页 /// ///public ActionResult Index() { return View(_bookRepository.Books); } }
不在沿用之前的布局页了,创建一个新的布局页 _AdmindLayout.cshtml:

@ViewBag.Title @RenderBody()
Site.css
.table { width: 100%; padding: 0; margin: 0; } .table th { font: bold 12px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; color: #4f6b72; border-right: 1px solid #C1DAD7; border-bottom: 1px solid #C1DAD7; border-top: 1px solid #C1DAD7; letter-spacing: 2px; text-transform: uppercase; text-align: left; padding: 6px 6px 6px 12px; background: #CAE8EA no-repeat; } .table td { border-right: 1px solid #C1DAD7; border-bottom: 1px solid #C1DAD7; background: #fff; font-size: 14px; padding: 6px 6px 6px 12px; color: #4f6b72; } .table td.alt { background: #F5FAFA; color: #797268; } .table th.spec, td.spec { border-left: 1px solid #C1DAD7; } 对应的Index.cshtml:
@model IEnumerable@{ Layout = "~/Views/Shared/_AdminLayout.cshtml"; } @Html.ActionLink("新增", "Edit")
@foreach (var item in Model) { 名称 描述 价格 分类 } @Html.DisplayFor(modelItem => item.Name) @Html.DisplayFor(modelItem => item.Description) @Html.DisplayFor(modelItem => item.Price) @Html.DisplayFor(modelItem => item.Category) @Html.ActionLink("编辑", "Edit", new { id = item.Id }) @using (Html.BeginForm("Delete", "Admin", FormMethod.Post, new { style = "display:inline;" })) { @Html.Hidden("id", item.Id) }

编辑,我把新增和编辑的位置放在一块,使用 id 进行区分,如果 id = 0 就表示新增的信息。
在 AdminCtroller 中添加关于编辑的方法
////// 编辑 /// /// ///public ActionResult Edit(int id = 0) { if (id == 0) { return View(new Book()); } var model = _bookRepository.Books.FirstOrDefault(x => x.Id == id); return View(model); } /// /// 编辑 /// /// ///[HttpPost] public ActionResult Edit(Book book) { if (!ModelState.IsValid) { return View(book); } _bookRepository.SaveBook(book); return RedirectToAction("Index"); }
更新存储库中的方法:

IBookRepository.cs
////// 书存储库接口 /// public interface IBookRepository { ////// 书模型集合 /// IQueryableBooks { get; } /// /// 保存书 /// /// ///int SaveBook(Book book); /// /// 删除书 /// /// ///Book DeleteBook(int id); }
EfBookRepository.cs
////// 书存储库 /// public class EfBookRepository : IBookRepository { private readonly EfDbContext _context = new EfDbContext(); ////// 书模型集合 /// public IQueryableBooks => _context.Books; /// /// 保存书 /// /// ///public int SaveBook(Book book) { if (book.Id == 0) { _context.Books.Add(book); } else { var model = _context.Books.Find(book.Id); if (model==null) { return 0; } model.Category = book.Category; model.Description = book.Description; model.Name = book.Name; model.Price = book.Price; } return _context.SaveChanges(); } /// /// 删除书 /// /// ///public Book DeleteBook(int id) { var model = _context.Books.Find(id); if (model == null) { return null; } _context.Books.Remove(model); _context.SaveChanges(); return model; } }
需要对 Book 模型加上验证用的特性:
[Table("Book")] public class Book { /// /// 标识 /// public int Id { get; set; } /// /// 名称 /// [Required(ErrorMessage = "名称不能为空")] public string Name { get; set; } /// /// 描述 /// [Required(ErrorMessage = "描述不能为空")] public string Description { get; set; } /// /// 价格 /// [Required(ErrorMessage = "价格不能为空")] [Range(0.01, double.MaxValue, ErrorMessage = "请填写合适的价格")] public decimal Price { get; set; } /// /// 分类 /// [Required(ErrorMessage = "分类不能为空")] public string Category { get; set; } } _AdminLayout.cshtml 需要引入验证用的 js(客户端验证):
Edit.cshtml
@model Wen.BooksStore.Domain.Entities.Book @{ Layout = "~/Views/Shared/_AdminLayout.cshtml"; } 编辑
@Html.ValidationSummary() @using (Html.BeginForm()) { @Html.HiddenFor(x => x.Id) 名称 @Html.TextBoxFor(x => x.Name) 价格 @Html.TextBoxFor(x => x.Price) 分类 @Html.TextBoxFor(x => x.Category) 描述 @Html.TextAreaFor(x => x.Description)
} 
图:错误提示

删除
////// 删除 /// /// ///[HttpPost] public ActionResult Delete(int id) { _bookRepository.DeleteBook(id); return RedirectToAction("Index"); }
加入提示,我们在新增、编辑和删除时应该加入必要的提示信息,使用TempData。

/Admin/Index.cshtml 下的也要添加:

执行效果:

【备注】TempData 临时数据保存了一条信息,是一个“键/值”字典,类似会话 Session 和 ViewBag,它和 Session 的差别是,在 HTTP 请求结束后会被删除。因为这里使用了 RedirectToAction ,一条重定向指令,会告诉浏览器重定向请求到一个新地址,这时就不能使用 ViewBag,ViewBag 用于在控制器与视图之间传递数据,但它保持数据的时间不能比当前的HTTP 请求长,重定向意味着用户是跨请求的,ViewBag 不能用于跨请求时传递数据。
登录授权认证过滤
上面是一个 Admin 的后台管理操作,不是每一个用户都能够进入管理的,所以现在加入登录授权认证功能,只有成功后,才能进入管理界面。
先在配置文件 WebConfig.cs 中加入
WebConfig.cs
提示: 本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- 一步步打造简单的MVC电商网站BooksStore(3)_实用技巧_
- 一步步打造简单的MVC电商网站BooksStore(2)_实用技巧_
- 一步步打造简单的MVC电商网站BooksStore(1)_实用技巧_
- Asp.net SignalR应用并实现群聊功能_实用技巧_
- ASP.NET MVC制作404跳转实例(非302和200)_实用技巧_
- ASP.NET网站第一次访问慢的解决方法_实用技巧_
- 小心!ASP.NET网站发布时的那些坑_实用技巧_
- asp.net实现多个文件同时下载功能_实用技巧_
- Visual Studio 2017创建.net standard类库编译出错原因及解决方法_实用技巧_
- ASP.NET数据库操作类实例_实用技巧_
点击排行
本栏推荐
