Asp.net mvc ViewModel

来源:互联网 发布:节奏大师软件下载 编辑:程序博客网 时间:2024/06/11 19:56
         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/ 版权所有,翻版必究~谢谢合作!

0 0