ASP.NET MVC 实现模式 - ModelBuilder
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET MVC 实现模式 - ModelBuilder
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
將ViewModel的創建過程從Controller中分離到ModelBuilder中,本質上是為了職責的分離,也提高了Controller的可讀性。
通常的情況
使用MVC時,在Controller中,會包含很多用于創建ViewModel的代碼。
讓我們從一個例子開始。
假設我們有一個用于呈現填寫訂單的頁面(~\Order\FT-BJS-95486),對應的Action 如下:
其中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. 問題
2. 分析
在上述的例子中,雖然OrderModel本身的結構及創建過程都非常簡單,但我們依然可以識別出重復的部分:
var p = ProductService.GetProduct(productNo); model.ProductName = product.ProductName;我們可以歸納出這些重復的部分,分屬于兩個ViewModel被創建的“階段”:
我們據此抽象出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創建OrderConfirmModelvar builder2 = new OrderConfirmModelBuilder(model);var model2 = builder2.Create();return View("OrderConfirm", model2); }這樣,就解決了我們在第1節中提出的兩個問題。
此文介紹的內容,無關語言和平臺。
轉載于:https://www.cnblogs.com/yicone/archive/2013/03/31/2991339.html
總結
以上是生活随笔為你收集整理的ASP.NET MVC 实现模式 - ModelBuilder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如果禁用了cookie 怎么传sessi
- 下一篇: 基础才是重中之重~用好configSec