Asp.net mvc ViewModel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013108485/article/details/51141664
         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/ 版权所有,翻版必究~谢谢合作!

展开阅读全文

没有更多推荐了,返回首页