上一節說了一些籠統的東西,這節說一些實際的操做。程序員
1.取列表。這是一個新聞列表:數據庫
對應MVC的model是:ui
public class NewsListModel { /// <summary> /// 新聞列表 /// </summary> public List<Model.ToolNewsInfo> NewsList { get; set; } }
ToolNewsInfo是三層中的Model,這樣,在Controller裏面就能夠直接使用BLL中的取列表方法:spa
[OutputCache(Duration = 600)] public ActionResult NewsList() { var bll = new ToolNews(); var newslist = bll.GetList("select * from ToolNews order by addtime desc "); Models.NewsListModel model = new NewsListModel(); model.NewsList = newslist; return View(model); }
以上沒考慮分頁,但取列表本質上是同樣的。code
2.新增、修改數據。blog
通常MVC裏的Model是這個樣子:get
public class NewsModel { public NewsModel() { } private Guid _id; private string _title; /// <summary> /// /// </summary> public Guid id { set { _id = value; } get { return _id; } } /// <summary> /// 標題 /// </summary> [Required(ErrorMessage = "請添寫一個標題")] public string Title { set { _title = value; } get { return _title; } } }
有可能牽涉到數據驗證,因此在Controller裏面不能使用三層的Model。須要把MVC的Model對應字段值傳遞給多層的Model:string
[HttpPost] [ValidateAntiForgeryToken] [ValidateInput(false)] public ActionResult EditNews(Models.NewsModel model) { if (ModelState.IsValid) { var bll = new ToolNews(); var entity = bll.GetModel(model.id); //多層Model entity.Title = model.Title; bll.Update(entity); //更新到數據庫 } return RedirectToAction("News"); }
這樣就能夠實現數據的傳遞。it
不過,表字段少的,能夠一一賦值,若是一個表七八十個字段,還要挨個複製,豈不是太苦逼了?程序員最煩複制了。咱們的天職是要簡化簡化再簡化。io
仔細觀察一下這兩種Model,發現有一個共性,就是對應數據表字段的屬性,名稱都是同樣的。感謝萬能的反射大神,這樣我就能夠很簡單的把一個類相同的屬性值複製給另外一個類:
/// <summary> /// 把源類中具備 相同屬性名的值 賦予目標類 /// </summary> /// <param name="source"></param> /// <param name="target"></param> public static void CloneSameProperties(object source, object target) { PropertyInfo[] sourceProperties = source.GetType().GetProperties(); foreach (PropertyInfo item in sourceProperties) { PropertyInfo targetProperty = target.GetType().GetProperty(item.Name); if (targetProperty != null) { targetProperty.SetValue(target, item.GetValue(source, null), null); } } }
這樣Controller裏的代碼能夠升級爲:
[HttpPost] [ValidateAntiForgeryToken] [ValidateInput(false)] public ActionResult EditNews(Models.NewsModel model) { if (ModelState.IsValid) { var bll = new ToolNews(); ToolNewsInfo entity = new ToolNewsInfo(); //多層Model ObjectPlus.CloneSameProperties(model, entity); bll.Update(entity); //更新到數據庫 } return RedirectToAction("News"); }
如此,數據操做就均可以走多層來實現。