《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】

简介:

接下来是关于SportsStore的后台管理功能,也就是通常的CRUD操作。
首先添加一个AdminController,代码如下:

View Code

我们通过一个List page来展示已有的products,接着在AdminController里面添加一个Action:

View Code

为我们的后台管理界面创建一个布局_AdminLayout.cshtml,在 Views/Shared上右键添加新项MVC 3 Layout Page

View Code

接着添加一个样式表单Admin.css,如下所示:

View Code

添加Index视图:

View Code

这里对数据库有改动,需要增加一个字段ImageURL(varchar(255)),并且在我们的SportsStore.WebUI项目新添加一个文件夹UploadImgs用来存放上传的图片。

编辑Product

创建一个Edit Action

View Code

创建Edit View,强类型的并引用了_AdminLayout.cshtml,

如下:

View Code

如果运行程序,这里并不会显示ProductID,因为这里没有必要显示出来。实现这个效果需要在Product实体里面使用模型元数据(model metedata)。它能让我们应用Attributes到Product的属性上面来影响Html.EditorForModel()方法输出的布局。

如下:

View Code

HiddenInput特性让MVC框架将该属性作为隐藏表单元素呈现,DataType特性允许我们指定一个值怎样显示或编辑。如这里将Description显示为MultilineText(多行文本)
这里需要添加一个引用System.Web.Mvc。

接着添加一些样式到Admin.css里面,如下:

View Code

这里看发现css里面的类名如.editor-field,我们并没有在View里面定义一个class属性,这个是MVC框架生成的,你可以查看页面源文件。而且ID都是属性名,这是模型绑定的结果,在前面的笔记有这些内容的。

为了编辑Product,我们需要添加相应的Repository和接口。在IProductsRepository里面添加一个方法:void SaveProduct(Product product);
接着实现该接口,如下:

View Code

初次路过的朋友可能会惊讶这里是什么东东,书中用的EF框架+MS SQL Server。我学着用的是iBatisnet+MySQL。如果你对iBatisnet不了解,可以先用下iBatisnet,上手还算比较容易。你也可以看看我前面笔记之十二,里面讲了我这里的使用情况。

这里我们需要在iBatisnet的映射文件Product.xml添加update语句,如下:

View Code

接着在AdminController里面重载一个处理HTTP Edit请求的action方法,如下:

复制代码
        [HttpPost]
public ActionResult Edit(Product product, HttpPostedFileBase image)//HttpPostedFileBase提供了对上传的文件单独访问
{
if (ModelState.IsValid)//如果验证通过才执行编辑
{
if (image != null)
{
string path = @"D:\Study\Projects\SportsStore\SportsStore.WebUI\UploadImgs\" + image.FileName;
image.SaveAs(path);//保存图片
product.ImageURL = image.FileName;

}
//接着执行保存的方法
repository.SaveProduct(product);
TempData["message"] = string.Format("{0} has been saved", product.Name);
return RedirectToAction("Index");
}
else
{
//如果验证未通过,则继续显示编辑页面,重新编辑
//there is something wrong with the data values
return View(product);
}
}
复制代码

当验证通过,会执行保存。这里我使用了TempData存储了一条提示信息,TempData是MVC框架提供的一个非常爽的功能。它是一个Dictionary的键值对,类似于Session和ViewBag。有一个关键的不同点是TempData会在HTTP请求结束被删除。

从上面的代码我们注意下Edit方法的返回值类型ActionResult.前面我使用大多是ViewResult。ViewResult是从ActionResult派生的,当我们想呈现一个View时就可以使用ViewResult的返回值类型。当然,ActionResult的其他类型也是可用的,其中一个就是RedirectToAction方法的返回值类型。

这里我们不能使用ViewBag,因为用户被重定向了,ViewBag在Controller和View传递数据并且ViewBag保存数据的时间不会比当前的Http请求,也就是说可能在Http请求没有结束时ViewBag里面数据已经丢失了,这就达不到我们要的效果。当然Session可以保存,但是Session会一直保存(除非服务器内存不足或是过期),直到我们显示的移除它,当然我们不情愿这样做。MVC框架提供的TempData功能就很完美的符合这里显示提示信息的要求。而且TempData里面的数据是限制在单个用户会话里面的(用户之前是不能相互查看对方的TempData),并且会一直保存知道我们读取了以后才被删除。我们将会在使用重定向到用户的action方法呈现View时读取TempData的数据。

接着我们在_AdminLayout里面使用TempData,为的是能够在引入了_AdminLayout的所以View里面使用。修改_AdminLayout.cshtml的代码如下:

View Code

上面我们引入了几个js文件是用来进行客户端验证的,这又是MVC框架提供给我们的一个非常爽的功能,我只需要在Product.cs里面为属性添加我需要限制的Attributes就能够实现验证用户输入的目的,引入了上面的两个js文件后,默认是开启了客户端验证的。当然服务器端验证是一定会有的。在大多数情况下,我们都希望进行客户端验证,因为这样会有一个比较好的用户体验。

但是如果我们不想进行客户端验证则可以这样做,则可以使用这两句代码:

HtmlHelper.ClientValidationEnabled = false; 
HtmlHelper.UnobtrusiveJavaScriptEnabled = false;

如果我们将这两句代码放到一个View或Controller里面,那客户端验证对当前的Action就不会使用。

我们也可以如果在配置文件里面配置来禁止整个程序使用客户端验证,如下配置:

View Code

接着我们实现创建一个新的Product,添加两个Create() action方法,一个是Get请求(没有加HttpGet Attribute表示默认Get),一个是处理HttpGet请求。我们呈现添加页面的时候调用的是Get,提交时调用Post。在AdminController里面添加的代码如下:

View Code

接着右键添加Create.cshtml,代码如下:

View Code

实现删除Product操作

首先添加一个接口方法:void DeleteProduct(Product product); 
接着实现该方法

View Code

关于iBatisnet的映射文件,在上面已经全部列出来了,所以这里就不在展示了。接着是创建Delete action方法,如下:

View Code

 

接着实现后台管理的安全性设置

asp.net mvc是建立在asp.net核心平台上的,所以我们可以访问asp.net form验证的功能,这也是一个比较通用的功能。只有登录成功的人才能操作后台。关于From验证,在书的22章会详细讲解。这里只是介绍了最基本的配置。在配置文件里面添加如下代码:

View Code

MVC框架有一个非常强大的功能称为filters。这些都是Attributes,应用到一个action方法或Controller类。当一个请求被处理的时候,这些Attributes引入了额外的逻辑。我们也可以定义自己的filter。

这部分内容会在13章详细介绍的,这里大概知道就行。其实我理解这里就是,filter功能用来实现权限控制,哪些action是需要权限的,只允许哪些用户方法的等等。当添加了这些filter后,处理请求的时候就会做额外的判断。

我们这里只是用到了Authorize。我们在AdminController类的上面添加这个filter,如下所示:

View Code

这样就表示只有通过验证的才可能访问该Controller,当然我可以细化到针对一个action方法。

这个时候运行程序,通过/Admin/Index URL进行后台会报错,因为并不存在Account/LogOn.

下面我们开始实现登录验证功能,在Infrastructure文件夹里面再创建一个Abstract文件夹,在该文件夹里面添加一个接口IAuthProvider,代码如下:

View Code

接着在Infrastructure文件夹里面再创建一个Concrete文件夹,添加一个实现类FormsAuthProvider.如下:

View Code

然后使用Ninject添加绑定,如下:

复制代码
        private void AddBindings()
{
ninjectKernel.Bind<IProductsRepository>().To<ProductsRepository>();
EmailSettings emailSettings = new EmailSettings {
 WriteAsFile = bool.Parse(ConfigurationManager.AppSettings["Email.WriteAsFile"] ?? "false") };
ninjectKernel.Bind<IOrderProcessor>().To<EmailOrderProcessor>().WithConstructorArgument("settings", emailSettings);
ninjectKernel.Bind<IAuthProvider>().To<FormsAuthProvider>();
}
复制代码

接着创建一个AccountController和LogOn action方法,实际上是重载的两个LogOn方法,一个处理Get呈现,一个处理Post提交验证。这之前我们需要创建一个view model来传递。在SportsStore.WebUI/Models里面添加一个新的类LogOnViewModel,代码如下:

View Code

接着我们添加AccountController,如下:

View Code

右键添加LogOn View,如下:

View Code

到这里,整个项目就结束了,呵呵!通过这个项目对MVC的理解应该加深了,后面进入到第二部分MVC3框架的讲解。因为项目后面对数据库进行了更改,所以你需要自己在相关的View里面添加显示图片的代码。如果你是按照我的笔记实际操作,遇到任何问题请及时留言!

好了,今天的笔记就到这里,祝大家周末愉快!公司如果这几天有年会的,祝大家都有好运中奖!

本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2012/01/14/mvcnotes_17.html如需转载请自行联系原作者


张雪飞

相关文章
|
存储 XML 前端开发
“自定义MVC原理解析与示例:打造优雅、可定制化的Java应用程序”(上)
“自定义MVC原理解析与示例:打造优雅、可定制化的Java应用程序”
61 0
|
4月前
|
API
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
【Azure 媒体服务】Media Service的编码示例 -- 创建缩略图子画面的.NET代码调试问题
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
44 7
|
4月前
|
XML API 图形学
【Azure Developer】.Net 简单示例 "文字动图显示" Typing to SVG
【Azure Developer】.Net 简单示例 "文字动图显示" Typing to SVG
【Azure Developer】.Net 简单示例 "文字动图显示" Typing to SVG
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
68 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
53 0
|
4月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
4月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
135 0
|
7月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
204 0
|
6月前
|
XML API 图形学
.Net 简单示例 "文字动图显示" Typing to SVG “
该文描述了一个.NET API的实现过程,该API能将输入的文字转换成SVG动态图。首先,作者展示了示例网站(&lt;https://readme-typing-svg.demolab.com/&gt;)的功能,它能将文字转化为可自定义样式的SVG动画。接着分析了示例URL的响应,发现其内容类型为`image/svg+xml`,主要由SVG、path、animate和text元素组成。通过创建一个.NET Core Web API项目,作者设置了响应内容类型为`image/svg+xml`,并将示例URL的SVG内容直接输出,成功实现了相同效果。