Asp.net mvc ViewModel

         MVC規定,View即V是純UI,不允許包含任何的邏輯層,所以在上節實例中已經違反了MVC基本準則(上節實例也是初學者應該遇到的內容),在上例中違反MVC的體系架構規則如下:
1、顯示全名——邏輯層
2、使用紅色標識年齡大於50的。使用簡單邏輯改變了HTML元素的外觀——邏輯層

ViewModel
        面對可能的問題,微軟就會提供解決該問題的方法,提出ViewModel,ViewModel是ASP.NET MVC應用中的隱式聲明的層,用來維護Model和View之間的數據傳遞,是View的數據容器。
Model和ViewModel區別
         Model是業務相關數據,是由業務和數據結構構建的模型,而ViewModel 是視圖相關的數據,是根據View創建。
 工作原理流:
1、用戶提出需求,Controller處理用戶的交互邏輯,執行簡單的判斷。
2、Controller獲取一個或者多個Model數據
3、Controller決策使用哪個View最符合用戶請求
4、Controller將根據Model數據和View需求創建並初始化ViewModel對象
5、Controller將ViewModel數據以ViewData或者ViewBag或者強類型的View等對象傳遞到View中,並返回View。
ViewModel分別與View,Model關聯方式:

View將變成ViewModel的強類型的View,Model卻和ViewModel是互相獨立的,Controller將根據Model對象創建並初始化ViewModel對象。


創建一個屬於自己的ViewModel(繼續利用前幾節使用的項目):

1、在項目中創建一個叫ViewModels的文件夾。


2、在ViewModels中新建一個TeacherViewModel
       爲了更好的掌握ViewModel,決定將年齡用不同的顏色顯示,當前用戶也要在View中顯示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Mvc_一.ViewModels
{
    public class TeacherViewModel
    {
        public string TeacherName { get; set; }
        public int TeacherId { get; set; }
        public int TeacherAge { get; set; }
        public string TeacherAgeColor { get; set; }  
        public string UserName { get; set; }
    }
} 

3、在上節例子中的強View類型修改爲TeacherViewModel

@model Mvc_一.ViewModels.TeacherViewModel 
4、使用下面的代碼替換掉View的內容

@model Mvc_一.ViewModels.TeacherViewModel
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>GetTeacherView</title>
</head>
<body>
    Hello @Model.UserName
    <hr />
    <div>
        <b>Teacher Details:</b><br />
             Teacher Name:@Model.TeacherName<br />
             Teacher Id:@Model.TeacherId<br />
        <span style="background-color:@Model.TeacherAge"> Teacher Age:@Model.TeacherAge</span>        
    </div>
</body>
</html>
5、在GetTeacherView中,獲取Model數據並且強制轉換爲ViewModel對象。

       public ActionResult GetTeacherView()
        {
            Teacher t = new Teacher();
            t.TeacherName = "John";
            t.TeacherId = 101010;
            t.TeacherAge = 55;
            TeacherViewModel tViewModel = new TeacherViewModel();
            tViewModel.TeacherName = t.TeacherName;
            tViewModel.TeacherId = t.TeacherId;
            tViewModel.TeacherAge = t.TeacherAge;
            if (tViewModel.TeacherAge > 50)
            {
                tViewModel.TeacherAgeColor = "Red";
            }
            else
            {
                tViewModel.TeacherAgeColor = "Black";
            }
            tViewModel.UserName = "Administrator";
            return View("GetTeacherView",tViewModel);
        }  
6、測試結果,此View中不包含任何業務邏輯



A | explian:
1、每個View都有其對應的ViewModel。
2、努力將Model和ViewModel相互獨立。
3、儘管ViewModel包含與Model幾乎相同的屬性,微軟建議每次都創建一個ViewModel,讓每個View都對應一個ViewModel。
4、如果一個View只顯示Model數據不包含任何呈現邏輯,不創建ViewModel就會無法滿足未來的需求,倘若未來需要添加新的數據,開發人員就必須從頭開始創建全新的UI。


轉載請標明出處 http://blog.csdn.net/jasonhds/ 版權所有,翻版必究~謝謝合作!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章