博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MVC 中的 ViewModel
阅读量:4638 次
发布时间:2019-06-09

本文共 2602 字,大约阅读时间需要 8 分钟。

 此文章总结自:

ViewModel 这个概念不只是在在MVC模式中有,你会在很多关于MVC、MVP、MVVM的文章中见到这个说法,并且这个概念在任何技术中都有可能提到,比如 ASP.NET, Silverlight, WPF, or MVC... 现在我们来讨论如何在MVC中使用它。

 

ASP.NET MVC ViewModel 是什么?

在 一般的情况下,我们向View中传递数据的时候,都是一个Model,当有一些额外的数据的时候,我们会使用viewbag等来进行,但是我们可以使用 ViewModel将这些整合在一起也就是说:ASP.NET MVC 中的ViewModel允许你将一个或者多个data model和资源整合到一个对象中去,以此使View使用model的时候得到优化,下面的图说明了ViewModel的概念:

使 用ViewModel的目的就是让View单个的对象来进行渲染,另一方面可以减少UI展示的逻辑代码,这个是很有必要的,也就是说View唯一的任务就 是渲染单个的ViewModel对象,为了让concerns之间有一个清晰的分离,解耦意味着你的程序被设计的更好,所以我们要将对数据处理的代码放在 它应该在的位置,远离View、controller。

 

在 MVC 中使用 ViewModel会让你的程序组件之间分离的更好,从而以与维护,记住,单元测试指的是测试小单元。下面列出的是你什么时候要使用ViewModel:

1、Incorporating dropdown lists of lookup data into a related entity

2、Master-detail records view Pagination:

3、combining actual data and paging information

4、Components like a shopping cart or user profile widget

5、Dashboards with multiple sources of disparate

6、data Reports, often with aggregate data

 

 

创建个ViewModel                                                                          

尽管Viewmodel包含了几个实体,但是它任然只是一个类,没有什么特别的,放置它的位置可以是:

1、一个叫做ViewModels的文件夹中,这个文件夹可以放在项目的根目录中;

2、作为一个dll,我们从MVC项目中引用它;

3、放在一个分开的项目中的service layer;

而第一种方式无疑是最简单的一种,我们只需要创建一个文件夹,然后创建一个类就行了。

 

为了创建一个CustomerViewModel,我们要将Customer和StateDirctionary类型作为属性,来共同组建一个CustomerViewModel类,代码如下:

public 
class CustomerViewModel 
    
public Customer Customer { 
get
set; } 
    
public StatesDictionary States { 
get
set; } 
    public CustomerViewModel(Customer customer) 
    { 
        Customer = customer; 
        States = 
new StatesDictionary(); 
    } 

 

 

将ViewModel发送到Veiw                                                               

当 然我们是从Controller开始的,将ViewModel发送到View和我们将普通的model发送到View的做法是一样的,因为 ViewModel只是一个类,View不知道也不会在意model或者viewModel是从哪里来的,你可以在controller中创建一个 ViewModel的实例,为了保证controller的整洁,没有额外的代码,在Controller中需要做的只是取得model或者 ViewModel的值,没有其他的:

public ActionResult Edit(
int id) 
     Customer customer = context.Customers.Single(x => x.Id == id); 
     var customerViewModel = 
new CustomerViewModel(customer); 
     return View(customerViewModel); 

 

 

然后就是view来渲染ViewModel                                                       

为了让View知道我们传过去的是哪一个对象,我们需要将@model关键字指向ViewModel,就像你在指定一个一般的model一样。

@model FourthCoffee.Web.ViewModels.CustomerViewModel

 

调用数据的代码:

<div class="editor-label">
   @Html.LabelFor(model => model.Customer.FirstName) 
</div>
<div class="editor-field">
   @Html.EditorFor(model => model.Customer.FirstName) 
   @Html.ValidationMessageFor(model => model.Customer.FirstName) 
</div>
@* ...View code continues rendering properties... 

 

 

使用ViewModel的小建议:                                                              

1、 因为使用ViewModel时需要手动的进行映射,但是当ViewModel很复杂的时候,这个将会变得比较困难,这个时候,我们就可以是使用 AutoMapper来简化简化工作,AutoMapper会让你顺畅的在ViewModel和models之间创建映射,除此之外还有:POCO Generator、EF POCO Templates

2、只把你在View上用来渲染的属性放到ViewModel中

3、用View来指导ViewModel属性的创建,这样才能更好的渲染和维护

 

转载于:https://www.cnblogs.com/wangcq/p/3621692.html

你可能感兴趣的文章
JAXB - Annotations, Annotations for Enums: XmlEnum, XmlEnumValue
查看>>
context 插图
查看>>
文件管理器中不支持的wma歌曲也显示可以播放的音乐图标
查看>>
Java基础学习-流程控制语句
查看>>
Shell中read的常用方式
查看>>
01javascript数据类型
查看>>
asp.net实现md5加密方法详解
查看>>
AJAX
查看>>
table 的thead th 固定 tbody滚动例子
查看>>
并行计算思考----回溯法求解数独问题
查看>>
设计模式:模板模式
查看>>
和菜鸟一起学OK6410之ADC模块
查看>>
代理 模式
查看>>
[git] 细说commit (git add/commit/diff/rm/reset 以及 index 的概念)
查看>>
DOM Core和HTML DOM的区别
查看>>
SurfaceView+MediaPlay的bug们
查看>>
网络表示学习总结
查看>>
完成评论功能
查看>>
far和near
查看>>
Python爬虫实战四之抓取淘宝MM照片
查看>>