原文地址:http://www.cnblogs.com/dingding3/archive/2010/08/21/MVC.html

最近公司一直在用MVC模式写程序,所以最近一直再查MVC的资料,目前在研究MVC的参数传递方法,因此有了此文。
MVC模式既可以通过Model传递参数,也可以用ViewData来保存数据,两种方式的组合传递参数就是一种新的模式了。
使用这种组合传参的新模式可以非常快的实现,但美中不足的是输入错误会导致错误,不能在编译时发现错误原因,而且ViewData必须要用as来转换。
从Controller传递数据到View视图模板
MVC模式一个典型的特征是严格的功能隔离。Model模型、Controller控制器和View视图各自定义了作用和职责,且相互之间以定义好的方式进行沟通。这有助于提升测试性和代码重用。
当Controller决定呈现HTML响应给客户端是,它负责显式传递给View模板所有需要的数据。View模板从不执行任何数据查询或应用程序逻辑 – 仅仅负责呈现Model或Controller传递过来的数据。

当需要从Controller传递不止一个Model对象时,就要用到ViewData字典或ViewModel模式。例如,当我们需要Controller在View呈现Dinner对象和支持的Countries列表的时候,采用如下两种方式来实现。

使用ViewData 字典

Controller基类公开了一个ViewData 字典属性,用来从Controllers传递额外的数据给Views视图。
     Controller中代码

view source print?
1 [Authorize]
2 public ActionResult Edit(int id)
3 {
4     Dinner dinner = dinnerRepository.GetDinner(id);
5      ViewData["Countries"] = new SelectList(PhoneValidator.Countries, dinner.Country);
6     return View(dinner);
7 }

上面代码中SelectList构造函数的第一个参数显示国家列表,第二个参数指定当前选中的国家。    
    View中代码

view source print?
1 <%= Html.DropDownList("Country", ViewData["Countries"] as SelectList)%>

上面代码中第一个参数表示输出的HTML表单元素名称,第二个参数是通过ViewData传递的模型类。
   使用ViewModel模式:
    ViewData的优点:非常快,容易实现
    ViewData的缺点:输入错误会导致错误;不能在编译期发现错误原因;在View视图模板中使用强类型时,ViewData要用as来转换。
    ViewModel模式:
    1.针对特定的View视图创建强类型的类
    2.公开View模板需要的动态参数值或内容
    3.Controller类填充和传递这些类给View模板去用
    4.优点:类型安全、编译期检查和编辑器的智能提示

    示例代码:

view source print?
01 public class DinnerFormViewModel
02 {
03        public Dinner Dinner {get; private set;}
04         public SelectList Countries{get; private set;}
05        public DinnerFormViewModel(Dinner dinner)
06        {
07             Dinner = dinner;
08             Countries = new SelectList(PhoneValidator.Countries,dinner.Country);
09        }
10 }

在Controller类中

view source print?
1 [Authorize]
2 public ActionResult Edit(int id)
3 {
4     Dinner dinner = dinnerRepository.GetDinner(id);
5     return View(new DinnerFormViewModel(dinner));
6 }

在View视图模板中
    头部Inherits = "System.Web.Mvc.ViewPage<NerdDinner.Models.Dinner>"改为
    Inherits = "System.Web.Mvc.ViewPage<NerdDinner.Controllers.DinnerFormViewModel>"
    绑定列表即为<% = Html.DropDownList("Country".Model.Countries) %>

下面我们需要更新视图中的代码。对于表单中的HTML元素的名称不需要更新,仍旧保持为Title、Country等等,我们需要更新HTML辅助方法,使用DinnerFormViewModel类来获取属性值。
view source print?
01 <p>
02 <label for="Title">Dinner Title:</label>
03 <%= Html.TextBox("Title", Model.Dinner.Title) %>
04 <%= Html.ValidationMessage("Title", "*") %>
05 </p>
06 <p>
07 <label for="Country">Country:</label>
08 <%= Html.DropDownList("Country", Model.Countries) %>
09 <%= Html.ValidationMessage("Country", "*") %>
10 </p>

同样地,我们也需要更新Edit Post方法,在产生错误时,使用DinnerFormViewModel类传递给视图模板:
view source print?
01 //
02 // POST: /Dinners/Edit/5
03 [
04 AcceptVerbs(HttpVerbs.Post)]
05 public ActionResult Edit(int id, FormCollection collection) {
06 Dinner dinner = dinnerRepository.GetDinner(id);
07 try {
08 UpdateModel(dinner);
09 dinnerRepository.Save();
10 return RedirectToAction("Details", new { id=dinner.DinnerID });
11 }
12 catch {
13 ModelState.AddModelErrors(dinner.GetRuleViolations());
14 return View(new DinnerFormViewModel(dinner));
15 }
16 }

我们也更新Create() Action方法,重用相同的DinnerFormViewModel类,在View中实现Country下拉列表框。下面是HTTP-GET的实现代码:
view source print?
1 //
2 // GET: /Dinners/Create
3 public ActionResult Create() {
4 Dinner dinner = new Dinner() {
5 EventDate = DateTime.Now.AddDays(7)
6 };
7 return View(new DinnerFormViewModel(dinner));
8 }

下面是HTTP-POST Create方法的实现代码:
view source print?
01 //
02 // POST: /Dinners/Create
03 [AcceptVerbs(HttpVerbs.Post)]
04 public ActionResult Create(Dinner dinner) {
05 if (ModelState.IsValid) {
06 try {
07 dinner.HostedBy = "SomeUser";
08 dinnerRepository.Add(dinner);
09 dinnerRepository.Save();
10 return RedirectToAction("Details", new { id=dinner.DinnerID });
11 }
12 catch {
13 ModelState.AddModelErrors(dinner.GetRuleViolations());
14 }
15 }
16 return View(new DinnerFormViewModel(dinner));
17 }

定制ViewModel类(Custom-shaped ViewModel Classes
在上面的实现方案中,DinnerFormViewModel类直接公开了2个公有属性:Dinner 模型对象和SelectList模型属性。这一方法适合于View模板中HTML用户界面元素和业务Model对象比较接近的场景。
如果不符合这一情况,可以考虑创建定制的ViewModel类,根据视图的使用情况创建优化的对象模型 – 该对象模型可能完全不同于底层的业务模型对象(Domain Model Object)。例如,该ViewModel类有可能公开不同的属性或者从多个Model对象中汇总的属性。
定制的ViewModel类不仅可用来从Controller传递数据到View去呈现,而且可用来处理从表单提交回来给Controller的action方法的数据。针对后一种情况,你可以让Action方法根据表单提交回来的数据更新ViewModel对象,接着使用ViewModel实例来映射或者获取时间的业务模型对象(Domain Model Object)。
定制ViewModel类提供了很好的灵活性,在任何时候,你发现View模板中的呈现代码或Action方法中表单提交代码越来越开始复杂时,你可以考虑使用定制的ViewModel了。通常,这意味着业务模型对象和View视图中的用户界面元素不一致,一个中介的定制ViewModel类就可以发挥作用了。

MVC模式还有很多妙用,以后还会写更多有关MVC的文章。

转载于:https://www.cnblogs.com/fcsh820/archive/2010/08/22/1805767.html

(转)MVC模式参数传递的探究相关推荐

  1. flask框架的参数传递以及MVC模式的图解

    初学flask的时候,一开始还好,只在一个文本内写个"Hello Word!".到了后面写博客的时候,就开始非常困惑了,尤其是jinjia2的使用,各种参数不知道是怎样的传入,当然 ...

  2. 小汤学编程之JavaEE学习day03——JSP组成结构、JSP原理、JSP生命周期、JSP九大内置对象、四大作用域、JSP的MVC模式

    一.JSP组成结构 二.JSP的原理 1.JSP的运行原理     2.分析JSP所生成的Servlet代码     3.JSP的执行过程 三.JSP生命周期 四.JSP九大内置对象 五.JSP四大作 ...

  3. java中mvc事务_java核心技术第五篇之事务和MVC模式

    第一部分:事务 1.事务的简介: 1.1 在一组操作中(比如增加操作,修改操作),只有增加和修改操作都成功之后,这两个操作才能真正的成功. ,如果这两个操作中,有一个失败了,这两个操作都失败了. 1. ...

  4. Standup Timer的MVC模式及项目结构分析

    前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用.从一些开源应用中吸收点东西,一边进行量的积累,一边探索android的 ...

  5. 谈 三层结构与MVC模式的区别

    谈 三层结构与MVC模式的区别 在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题.     那么我也来讲讲我对这两者的理解吧.    ...

  6. 理解MVC—从实例出发:基于MVC模式的简易算术计算器

    MVC模式:MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller). ...

  7. JDBC - 开发实例 - MVC模式

    JDBC - 开发实例 - MVC模式  1. 在web.xml中配置连接数据库的信息 web.xml: <context-param> <param-name>server& ...

  8. MVC模式下My97DatePicker日期控件引用注意事项

    My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...

  9. (iOS-框架封装)iOS设计模式——MVC模式

    MVC模式是iOS编程中提到的最多次的设计模式,也是使用最频繁的设计模式之一.网络上有很多的MVC模式的分析文章,但都是从原理上来解释,很少能找到配套的案例来说明到底在实际的项目中要如何的使用这种模式 ...

最新文章

  1. JAVA中一维数组的作用,JAVA中一维数组和二维数组的定义
  2. [搜索]波特词干(Porter Streamming)提取算法详解(1)
  3. Linux系统下如何挂载FAT32的U盘
  4. redis的学习使用,第一章
  5. 有序链表转换二叉搜索树Python解法
  6. linux+cp+-rdf,简单构建基于RDF和SPARQL的KBQA(知识图谱问答系统)
  7. 内容主题windows下简单的vbscript自动发送邮件--带附件
  8. java+getactionmap_Struts2 使用OGNL遍历map方法详解
  9. positive definite quadratic form and positive definite matrix
  10. hbase小版本升级
  11. 终于实现不同站点间list共享了!哈哈
  12. 计算机网络(HCIP、HCIE)系列文章大合集
  13. 对软件开发人员的几个阶段思考和总结
  14. 微信小程序map组件拖拽地图获取经纬度,地址,带定位点范围(中心点固定)
  15. 明势资本黄明明:创新与世界,下一代基础软件的中国突围之路
  16. java主机哪儿好_java虚拟主机哪个好,香港java虚拟主机哪里有!
  17. RTSP播放器高RTSP兼容推流网页无插件流媒体播放器EasyPlayer-RTSP关于MP4的封装调用流程介绍
  18. RGB 颜色透明16进制表示
  19. 20176408李俊 线性表
  20. 【什么是渲染目标(render target)】

热门文章

  1. 计算机二级网址打不开,大神为你解决win7系统打不开二级网页链接的操作教程...
  2. js中window.onload 与 jquery中$(document.ready()) 测试
  3. 【C++进阶】利用重载二元运算符改进平面向量类Vec2D
  4. Java StringBuffer insert(int offset,String s)方法,带示例
  5. 分析酸对酸性染料染羊毛染色性能的影响?举例说明酸性染料染羊毛时,如何选择合适的染浴pH值?并说明原因。
  6. java反射对象赋值_Java反射详解
  7. 远控免杀专题1---基础篇
  8. hihoCoder 1227 2015 北京网络赛 A题
  9. 关于fd和fp(fd:file descirptor fp:file pointor)
  10. c语言循环拆分成和,C语言拆分循环链表程序