宝哥软件园

一步步打造简单的手动音量调节电商网站书店(4)

编辑:宝哥软件园 来源:互联网 时间:2021-09-05

一步步打造一个简单的手动音量调节电商网站-书店(四)

本系列的开源代码库地址:https://github.com/liqingwen 2015/文.书店

《一步步打造一个简单的 MVC 电商网站 - BooksStore(一)》

《一步步打造一个简单的 MVC 电商网站 - BooksStore(二)》

《一步步打造一个简单的 MVC 电商网站 - BooksStore(三)》

《一步步打造一个简单的 MVC 电商网站 - BooksStore(四)》

简介

上一节我们完成了两个主要功能:完成了整个购物车的流程,以及订单处理(发邮件进行通知),今天我们来学习一下最基本的增删改查,以及登录认证过滤器,加入防CSRF攻击,本系列已完结。

该系列主要功能与知识点如下:

分类、产品浏览、购物车、结算、CRUD(增删改查)管理、发邮件、分页、模型绑定、认证过滤器和单元测试等。

【备注】项目使用VS2015 C#6进行开发,有问题请发表在留言区哦,还有,页面长得比较丑,请见谅。

目录

基本的增删改查创建、读取、更新和删除

登录授权认证过滤

基本的增删改查创建、读取、更新和删除

我们创建一个新的控制器进行增删改查功能,AdminController,并添加一个显示所有数据的方法:

///摘要///后台管理控制器////摘要公共类管理控制器:控制器{私有只读图书存储库_图书存储库;公共管理控制器(ibook repository book repository){ _ book repository=book repository;} ///摘要///首页////summary///returns/returns public action result Index(){ return View(_ book repository).书籍);} }不在沿用之前的布局页了,创建一个新的布局页_AdmindLayout.cshtml:

!DOCTYPE htmlhtmlhead元名称=' viewport '内容=' width=设备宽度'/title@ViewBag.Title/title链接href=' ~/目录/管理/网站。CSS ' rel='样式表/head body div @ render body()/div/body/html站点。半铸钢钢性铸铁(Cast Semi-Steel)。表{宽度: 100%;padd : 0;保证金: 0;} .表Helvetica阿里亚尔凡尔达纳,无衬线;color : # 4f 6b 72 border-right : 1px实心# C1DAD7边框-bottom: 1px实心# C1DAD7边框-top: 1px实心# C1DAD7字母间距2 xtext-transform :大写;文本-左对齐:padding: 6px 6px 6px 12px背景: #CAE8EA不重复;} .表td {边框-右侧: 1px实心# C1DAD7边框-bottom: 1px实心# C1DAD7背景# fffont-size : 14px;padd : 6px 6px 6px 12pxcolor 3360 # 4f 6b 72 }。表TD . alt { background : # f5Fafacolor : # 797268 }。表th.spec,td.spec {边框-左侧: 1px实心# C1DAD7}对应的Index.cshtml:

@model IEnumerableWen .书店。领域。实体。book @ { Layout=' ~/view/Shared/_ admin Layout。“cshtml”;}p @Html .ActionLink('新增、"编辑")/可编辑类="表“tr th名称/th描述/th价格/th分类/th/th/tr @ foreach(模型中的定义变量项目){ tr td @Html .显示(模型项目=项目.名称)/td td @Html .显示(模型项目=项目.描述)/td td @Html .显示(模型项目=项目.价格)/td td @Html .显示(模型项目=项目.类别)/td td @Html .ActionLink('编辑,'编辑,新{ id=item .id })@使用(Html .开始通知('删除','管理,表单方法发布,新的{ style=' display : inline ' }){ @ Html .隐藏(“id”,项目身份证)输入类型='提交'值='删除/}/TD/tr }/table

编辑,我把新增和编辑的位置放在一块,使用编号进行区分,如果id=0就表示新增的信息。

在管理器中添加关于编辑的方法

///摘要///编辑////summary////param name=' id '/param///returns/returns public action result Edit(int id=0){ if(id==0){ return View(new Book());} var模型=_bookRepository .书籍。first or default(x=x . Id==Id);返回视图(模型);} ///摘要///编辑////summary////param name=' Book '/param////returns/returns[httpset]公共操作结果Edit(Book Book){ if(!ModelState .IsValid){ 0返回视图(书);} _bookRepository .SaveBook(书);返回RedirectToAction(' Index ');}更新存储库中的方法:

IBookRepository.cs

///摘要///书存储库接口////摘要公共接口IBookRepository { ///摘要///书模型集合////摘要IQueryableBook Books { get }////摘要///保存书////summary////param name=' Book '/param////returns/returns int save Book(Book Book);///摘要///删除书////summary////param name=' id '/param////returns/returns Book delete Book(int id);}EfBookRepository.cs

///摘要///书存储库////摘要公共类EfBookRepository : IBookRepository { private readonly EfDbContext _ context=new EfDbContext();///摘要///书模型集合////摘要公共IQueryableBook Books=_context .书籍;///摘要///保存书////summary////param name=' Book '/param////returns/returns public int save Book(Book Book){ if(Book .Id==0) { _context .书籍。添加(书籍);} else { var model=_context .书。找到(书. id);if(model==null){ 0返回0;}型号。类别=书籍。类别;模特。描述=书。描述;模特名字=书.名称;模特。价格=书。价格;}返回_上下文saveChanges();} ///摘要///删除书////summary////param name=' id '/param////returns/returns public Book delete Book(int id){ var model=_ context .书籍。查找(id);if(model==null){ 0返回null} _上下文。书籍。移除(模型);_上下文saveChanges();退货模式;} }需要对书模型加上验证用的特性:

[表格(“书”)]公开课Book { ///summary ///标识////summary public int Id { get;设置;} ///摘要///名称////摘要[必选(错误消息='名称不能为空)]公共字符串名称{ get设置;} ///摘要///描述////摘要[必选(错误消息='描述不能为空)]公共字符串描述{ get设置;} ///摘要///价格////摘要[必选(错误消息='价格不能为空)][范围(0.01,双倍“MaxValue,ErrorMessage=”请填写合适的价格)]公共十进制价格{获取设置;} ///摘要///分类////摘要[必选(错误消息='分类不能为空)]公共字符串类别{ get设置;} }_AdminLayout.cshtml需要引入验证用的js(客户端验证):

script src=' http : ~/Scripts/jquery-1。10 .2 .js '/script script src=' http : ~/Scripts/jquery。验证。js '/script script src=' http : ~/Scripts/jquery。验证。独立。js '/脚本编辑。cshtml

@模特文书店。领域。实体。book @ { Layout=' ~/view/Shared/_ admin Layout。“cshtml”;}h2编辑/h2div @Html .ValidationSummary()@ div使用(Html .begin inform()){ @ Html .HiddenFor(x=x.Id)表tr td名称TD/TD @ Html .TextBoxFor(x=x.Name)/td /tr tr td价格TD/TD @ Html .(x=x .价格)/TD/tr TD的文本框分类TD/TD @ Html .TextBoxFor(x=x。类别)/td /tr描述TD/TD @ Html .(x=x .描述)/TD/tr/表格的文本输入类型='提交'值='提交/}/div/div

图:错误提示

删除

///摘要///删除////summary////param name=' id '/param////returns/returns[HttpSet]公共操作结果Delete(int id){ _ book repository .删除图书(id);返回RedirectToAction(' Index ');}加入提示,我们在新增、编辑和删除时应该加入必要的提示信息,使用临时数据。

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

执行效果:

【备注】TempData临时数据保存了一条信息,是一个"键/值"字典,类似会话会议和视图包,它和会议的差别是,在超文本传送协议请求结束后会被删除。因为这里使用了重定向至操作,一条重定向指令,会告诉浏览器重定向请求到一个新地址,这时就不能使用视图包,视图包用于在控制器与视图之间传递数据,但它保持数据的时间不能比当前的超文本传送协议请求长,重定向意味着用户是跨请求的,视图包不能用于跨请求时传递数据。

登录授权认证过滤

上面是一个管理的后台管理操作,不是每一个用户都能够进入管理的,所以现在加入登录授权认证功能,只有成功后,才能进入管理界面。

先在配置文件WebConfig.cs中加入

身份验证模式='表单'表单登录=' ~/帐户/登录'超时=' 2880 '凭据密码格式='清除'用户名='admin '密码='123'/凭据/Forms/authenticationwebconfig。铯

?可扩展标记语言版本='1.0 '编码='utf-8 '?-有关如何配置ASP。网应用程序的更多信息,请访问http://go.microsoft.com/fwlink/?LinkId=301880-配置连接字符串添加名称=' EfDbContext ' connectionString=' server=' .数据库=TestDbuid=sapwd=123 ' providerName=' System .数据。SqlClient//connectionStrings appSettings add key='网页3360版本'值=' 3 .0 .0 .0 '/添加键='网页3360已启用'值=' false '/add key=' ClientValidationEnabled '值=' true '/add key=' independar JavaScript enabled '值='true'/add key='SendEmailName '值='[email protected]'//appSettings system。网身份验证模式=' Forms ' Forms loginroll=' ~/Account/log in应用洞察人工智能。Web//httpModules/System。网运行时程序集绑定xmlns=' urn : schemas-Microsoft-com : ASM。“v1”依赖程序集标识名=“System .网络。helper '公钥标记=' 31bf 3856 ad 364 e 35 '/绑定直接旧版本=' 1。0 .0 .0-3 .0 .0 .“0”新版本=“3”。0 .0 .0 '/依赖程序集依赖程序集标识名=' System .网络。网页公钥标记=' 31bf 3856 ad 364 e 35 '/绑定直接旧版本=' 1。0 .0 .0-3 .0 .0 .“0”新版本=“3”。0 .0 .0 '/依赖程序集依赖程序集标识名=' System .网络。Mvc '公钥标记=' 31bf 3856 ad 364 e 35 '/BindingRedirect旧版本=' 1。0 .0 .0-5 .2 .3 .“0”新版本=“5”。2 .3 .0 '/依赖程序集/程序集绑定/运行时系统。codedom编译器编译器语言=' c#;cs;csharp' extension=' .cs' type='Microsoft .CodeDom。提供商。dotnetcompiler平台。csharpcodprovider,微软CodeDom。提供商。dotnetcompiler平台,Version=1.0.0.0,Culture=neutral,公钥标记=31bf 3856 ad 364 e 35 '警告级别=' 4 '编译选项='/lang Version :6/nowarn :1659;1699;1701'/编译器语言=' vbvbsvisualbasicvbscript '扩展名="。vb' type='Microsoft .代码提供者,微软CodeDom。提供商。dotnetcompiler平台,Version=1.0.0.0,Culture=neutral,public key token=31bf 3856 ad 364 e 35 ' warning level=' 4 ' compiler options='/lang Version :14/nowarn 336041008/define : _ MYTYPE= ' Web '/option expert '/编译器/system。CodeDom系统。web服务器验证validate integrated mode configuration=' false '/模块移除名称='应用洞察人工智能。web ' preference=' managed handler '/modules/system。web服务器/配置在这里使用的授权认证模式为表单认证,为了简化与数据库的交互操作,采取的是硬编码的形式。如果尚未得到认证,会跳转到帐户/登录的地址让管理员先进行登录,超时表示登录(即认证)成功的保持时长为2880 分钟(即48 小时),而名字表示的就是用户名,密码表示的就是登录密码。

这里采用的是授权认证过滤器,我们需要对要认证后才能进入的控制器添加一个特性[授权],即对管理控制器添加该特性。

新建表单认证提供器,一个接口和一个实现:

IAuthProvider.cs:

公共接口IAuthProvider { ///summary ///认证////summary////param name=' userName '/param///param name=' password '/param///returns/returns bool Auth(字符串用户名,字符串密码);}FormsAuthProvider.cs:

///摘要///表单认证提供者////摘要公共类formsauthprovider : iauth提供程序{///summary//认证////summary////param name=' userName '/param///param name=' password '/param///返回/返回公共bool Auth(字符串用户名,字符串密码){ var result=FormsAuthentication .验证(用户名、密码);if (result) { //设置认证饼干表单验证SetAuthCookie(userName,false);}返回结果;} }添加绑定()方法中注册:

///摘要///添加绑定////摘要私有void AddBindings(){ _ kernel .BindIBookRepository().ToEfBookRepository();_内核BindIOrderProcessor().ToEmailOrderProcessor();_内核BindIAuthProvider().ToFormsAuthProvider();}

///摘要///登录视图模型////汇总公共类loginview模型{[必选(错误消息='用户名不能为空)]公共字符串用户名{ get设置;}[必需(错误消息='密码不能为空)] [DataType(数据类型.密码])公共字符串密码{ get设置;} }新建帐户控制器

公共类帐户控制器:控制器{私有只读iauth provider _ authproviderppublic帐户控制器(iauth provider authProvider){ _ authProvider=authProvider;} ///摘要///登录////summary////returns/returns public action result log in(){ return View();} ///摘要///登录////summary////param name=' model '/param////returns/returns[httpset][validateantforgretoken]公共操作结果登录(loginview model){ if(!ModelState .IsValid){ 0返回视图(新的login view model());} var result=_authProvider .Auth(模型。用户名,型号。密码);如果(结果)返回RedirectToAction('Index ',' Admin ');ModelState .AddModelError(','账号或用户名有误');返回视图(新的login view model());} }Login.cshtml登录页面:

@模特文书店。webui。模特。loginview模型@ { Layout=null}!DOCTYPE html html lang=' zh ' head meta charset=' UTF-8 ' meta http-equiv=' X-UA-Compatible ' content=' IE=edge,chrome=1 ' meta name=' viewport ' content=' width=device-width,initial-scale=1.0 '标题登录/title @*link rel='样式表href=' https://最大cdn。bootstrapcdn。com/font-awesome/4。5 .0/CSS/font-牛逼。量滴CSS ' * @ link rel='样式表href=' https://最大cdn。bootstrapcdn。com/bootstrap/3。3 .6/CSS/bootstrap。量滴CSS ' @ * link href=' ~/Contents/log/CSS/html af-demo。CSS ' rel=' family=roboto :300);登录页面{ margin : auto add : 8% 00;宽度: 360 px} .表单{ background : # ffffbox-shadow : 0 20px 0 rgba(0,0,0,0.2),0 5px 5px 0 rgba(0,0,0,0.24);余量: 0自动100像素最大宽度: 360 pxpadding: 45px相对位置:文本对齐:中心;z-index : 1;} .表单输入{ background : # f2f2f 2 border : 0;盒子尺寸:边框盒子;font-family: 'Roboto ',无衬线;font-size : 14pxmargin : 0 0 15 pxout line : 0;padding: 15px宽度: 100%;} .表单按钮{-WebKit-transit :全0.3轻松;背景# 4ca f50 border : 0;color: # FFFFFFcursor:指针;字体系列: '微软雅黑,'机器人',无衬线;font-size : 14px轮廓: 0;padd : 15 extxt-transform :大写;过渡:全部0.3轻松;宽度: 100%;} .表单按钮:悬停,表单按钮:活动,表单按钮:焦点{背景: # 43A 047} .形式。消息{ color : # b3b 3;font-size : 12pxmargin: 15px 0 0}。形式。消息a { color: # 4CAF50文本装饰:无;} .形式。注册表单{ display:无}。集装箱{ margin: 0 auto最大宽度: 300像素;相对位置:z-index : 1;} .container:before。容器:后{清除:两者;内容: " ";显示器:块;} .集装箱。信息{ margin: 50px auto文本对齐:中心;} .集装箱。信息h1 { color : # 1a 1a 1 font-size : 36px;字体粗细: 300;margin: 0 0 15pxpadd : 0} .集装箱。信息跨度{ color : # 4d 4d 4d font-size : 12px;} .集装箱。信息跨度a { color: # 000000文本装饰:无;} .集装箱。信息跨度fa { color: # EF3B3A}车身{-moz-OSX-font-smooth :灰度;-网络套件-字体-流畅:抗锯齿;背景技术# 76b852/*旧浏览器的回退*/background :-web套件-线性-渐变(右、#76b852、# 8DC26F);背景:-moz-线性梯度(右、#76b852、# 8DC26F);背景:-o-线性梯度(右、#76b852、# 8DC26F);背景技术:线性渐变(向左、#76b852、# 8DC26F);font-family: 'Roboto ',无衬线;} /style!-[if IE]脚本src=' http :http://cdn。bootscs。com/html 5 shiv/3。7 .3/html 5 shiv。量滴js '/脚本![endif]-script src=' http : ~/Scripts/jquery-1。10 .2 .js '/script script src=' http : ~/Scripts/jquery。验证。js '/script script src=' http : ~/Scripts/jquery。验证。未破裂。js '/script/head dy div id=' wrapper ' class=' log in-page ' div id=' log in _ form ' class=' form ' @使用(Html .开始通知('登录','帐户,表单方法Post,new { @ class=' log in-form ' }){ span style=' float : left;颜色:红色;@Html .ValidationSummary()/span @Html .antiforgrytoken()@ Html .TextBoxFor(x=x.UserName,new { placeholder='用户名}) @Html .EditorFor(x=x。密码,新的{占位符='密码,})输入类型='提交'值='登录/}/div/div/body/html(9513 . 163.com)

【备注】有效的防伪标志特性用于防止跨站请求伪造(CSRF)攻击。

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

更多资讯
游戏推荐
更多+