如何讓MVC和多層架構和諧並存(二)

上一節說了一些籠統的東西,這節說一些實際的操做。程序員

1.取列表。這是一個新聞列表:數據庫

 

 

W)_3}1LCOO9D83RIASEI7`H

 

 

對應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");
}

如此,數據操做就均可以走多層來實現。

相關文章
相關標籤/搜索