ASP.NET MVC 实现模式 - ModelBuilder
2013-03-31 10:28
621 查看
将
让我们从一个例子开始。
假设我们有一个用于呈现填写订单的页面(
其中OrderModel 这个
接下来,为了接收用户输入的订单信息,我们可能会有这样一个
ViewModel会在不同阶段被创建出来,不同阶段的创建过程,往往出现一些重复的代码
我们可以归纳出这些重复的部分,分属于两个
Create
Rebuild
我们据此抽象出
用OrderModelBuilder来简化OrderController
这样,就解决了我们在第1节中提出的两个问题。
此文介绍的内容,无关语言和平台。
ViewModel的创建过程从
Controller中分离到
ModelBuilder中,本质上是为了职责的分离,也提高了Controller的可读性。
通常的情况
使用MVC时,在Controller中,会包含很多用于创建ViewModel的代码。让我们从一个例子开始。
假设我们有一个用于呈现填写订单的页面(
~\Order\FT-BJS-95486),对应的Action 如下:
public ActionResult Order(string productNo) { var p = ProductService.GetProduct(productNo); var model = new OrderModel { ProductNo = productNo, ProductName = p.ProductName, }; return View(model); }
其中OrderModel 这个
ViewModel的定义为:
public class OrderModel { public string ProductNo { get; set; } public string ProductName { get; set; } public int Count { get; set; } public string Address { get; set; } }
接下来,为了接收用户输入的订单信息,我们可能会有这样一个
Action:
[HttpPost] public ActionResult Order(OrderModel model) { var p = ProductService.GetProduct(productNo); if(!ModelState.IsVaidate()) { // 这里假设: // 1. ProductName并没用通过hidden input的方式post回来 // 2. ProductNo 随同其它用户输入信息post回来 model.ProductName = p.ProductName; return View(model); } var model2 = new OrderConfirmModel { ProductNo = model.ProductNo, ProductName = p.ProductName, Count = model.Count, Address = model.Address, }; return View("OrderConfirm", model2); }
1. 问题
有些ViewModel的创建可能比较“复杂”,从阅读Controller的角度,不是“主控制流”ViewModel会在不同阶段被创建出来,不同阶段的创建过程,往往出现一些重复的代码
2. 分析
在上述的例子中,虽然OrderModel本身的结构及创建过程都非常简单,但我们依然可以识别出重复的部分:var p = ProductService.GetProduct(productNo); model.ProductName = product.ProductName;
我们可以归纳出这些重复的部分,分属于两个
ViewModel被创建的“阶段”:
Create
Rebuild
我们据此抽象出
IModelBuilder接口
public interface IModelBuilder<TViewModel> { TViewModel Create(); TViewModel Rebuild(TViewModel model); }
3. 改造
我们来写一个OrderModelBuilder,实现IModelBuilder接口public class OrderModelBuilder : IModelBuilder<OrderModel> { private string _productNo; private string _productName; public OrderModelBuilder(string productNo, string productName) { _productNo = productNo; _productName = productName; } public OrderModel Create() { var model = new OrderModel { ProductNo = _productNo, }; model = this.Rebuild(model); return model; } public OrderModel Rebuild(OrderModel model) { model.ProductName = _productName; return model; } }
用OrderModelBuilder来简化OrderController
private OrderModelBuilder GetBuilder(string productNo) { var p = ProductService.GetProduct(productNo); var builder = new OrderModelBuilder(p); return builder; } public ActionResult Order(string productNo) { var builder = GetBuilder(productNo); var model = builder.Create(); return View(model); } [HttpPost] public ActionResult Order(OrderModel model) { if(!model.IsVaidate()) { var builder = GetBuilder(model.ProductNo); var model = builder.Rebuild(model); return View(model); } // 根据OrderModel创建OrderConfirmModel var builder2 = new OrderConfirmModelBuilder(model); var model2 = builder2.Create(); return View("OrderConfirm", model2); }
这样,就解决了我们在第1节中提出的两个问题。
此文介绍的内容,无关语言和平台。
相关文章推荐
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
- 深入ASP.NET MVC之六:Model Binding的实现
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)
- 在Asp.Net MVC中实现CompareValues标签对Model中的属性进行验证
- 【EntityFramework系列教程九,翻译】在ASP.NET MVC程序中实现存储与单元工作模式
- Asp.net MVC中提交集合对象,实现Model绑定
- (收藏)在ASP.NET中实现Model-View-Controller模式(二)
- 如何应用Asp.Net Mvc内建功能(DefaultModelBinder)实现简单类型、复杂类型、集合类型,以及字典类型的自动绑定
- ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现
- ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现
- asp.net mvc中自行搭建实现工厂模式的spring.net+三层架构(一)
- ASP.NET MVC传递Model到视图的多种方式总结(二)__关于ViewBag、ViewData和TempData的实现机制与区别
- (收藏)在ASP.NET中实现Model-View-Controller模式(三)
- .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(三)
- 在ASP.NET中实现Model-View-Controller模式
- 深入ASP.NET MVC :Model Template与Html.Editor的实现
- asp.net mvc中自行搭建实现工厂模式的spring.net+三层架构 (15-4-20)
- Asp.net MVC中提交集合对象,实现Model绑定
- (收藏)在ASP.NET中实现Model-View-Controller模式(五)
- ASP.NET MVC:如何实现一个自己的ModelBinder?