《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如需转载请自行联系原作者


张雪飞

相关文章
|
8月前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
143 26
|
8月前
|
开发框架 安全 .NET
【Azure Developer】.NET Aspire 项目本地调试遇 Grpc.Core.RpcException 异常( Error starting gRPC call ... )
Error starting gRPC call. HttpRequestException: The SSL connection could not be established, see inner exception. AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot
164 12
|
7月前
|
传感器 人工智能 机器人
D1net阅闻|OpenAI机器人项目招新 或自研传感器
D1net阅闻|OpenAI机器人项目招新 或自研传感器
|
11月前
|
设计模式 前端开发 Java
Spring MVC——项目创建和建立请求连接
MVC是一种软件架构设计模式,将应用分为模型、视图和控制器三部分。Spring MVC是基于MVC模式的Web框架,通过`@RequestMapping`等注解实现URL路由映射,支持GET和POST请求,并可传递参数。创建Spring MVC项目与Spring Boot类似,使用`@RestController`注解标记控制器类。
124 1
Spring MVC——项目创建和建立请求连接
|
10月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
307 3
|
10月前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
11月前
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
188 1
|
11月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
130 2
|
12月前
|
开发框架 .NET C#
VSCode开发.net项目时调试无效
【9月更文挑战第22天】在使用 VSCode 开发 .NET 项目时遇到调试问题,可从项目配置、调试配置、调试器安装、运行环境、日志和错误信息等方面排查。确认项目类型及文件配置,检查 `launch.json` 文件及配置项,确保调试器扩展已安装并启用,验证 .NET 运行时版本和环境变量,查看 VSCode 输出窗口和项目日志文件,检查权限及代码错误。若问题仍未解决,可查阅官方文档或社区论坛。
387 4
|
12月前
|
C#
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?