zoukankan      html  css  js  c++  java
  • [转]Asp.Net MVC之ViewData字典与ViewModel模式

        当需要从Controller传递不止一个Model对象时,就要用到ViewData字典或ViewModel模式。例如,当我们需要Controller在View呈现Dinner对象和支持的Countries列表的时候,采用如下两种方式来实现。
        使用ViewData字典方式
        Controller中代码
        [Authorize]
        public ActionResult Edit(int id)
        {
            Dinner dinner = dinnerRepository.GetDinner(id);
            ViewData["Countries"] = new SelectList(PhoneValidator.AllCountries,dinner.Country);
            return View(dinner);
        }
        上面代码中SelectList构造函数的第一个参数显示国家列表,第二个参数指定当前选中的国家。    
        View中代码
        <% = Html.DropDownList("Country",ViewData["Countries"] as SelectList) %>
        上面代码中第一个参数表示输出的HTML表单元素名称,第二个参数是通过ViewData传递的模型类。
        使用ViewModel模式:
        ViewData的优点:非常快,容易实现
        ViewData的缺点:输入错误会导致错误;不能在编译期发现错误原因;在View视图模板中使用强类型时,ViewData要用as来转换。
        ViewModel模式:
        1.针对特定的View视图创建强类型的类
        2.公开View模板需要的动态参数值或内容
        3.Controller类填充和传递这些类给View模板去用
        4.优点:类型安全、编译期检查和编辑器的智能提示
        示例代码:
        public class DinnerFormViewModel
        {
               public Dinner Dinner {get; private set;}
               public SelectList Countries{get; private set;}
               public DinnerFormViewModel(Dinner dinner)
               {
                    Dinner = dinner;
                    Countries = new SelectList(PhoneValidator.Countries,dinner.Country);
               }

        }
        在Controller类中
        [Authorize]
        public ActionResult Edit(int id)
        {
            Dinner dinner = dinnerRepository.GetDinner(id);
            return View(new DinnerFormViewModel(dinner));
        }
        在View视图模板中
        头部Inherits = "System.Web.Mvc.ViewPage<NerdDinner.Models.Dinner>"改为
        Inherits = "System.Web.Mvc.ViewPage<NerdDinner.Controllers.DinnerFormViewModel>"
        绑定列表即为<% = Html.DropDownList("Country".Model.Countries) %>

  • 相关阅读:
    eclipse ve 问题
    NHibernate配置
    JDOM/XPATH编程指南
    win2003的IIS配置的陷阱
    关于setInterval的用法
    用Visio来做工作流定义工具
    分类算法要解决的问题
    win2003 运行 aspx程序出现Temporary ASP.NET Files 访问被拒绝 的解决方法
    ado recordset的一个陷阱
    为ServerXMLHTTP对象的HTTP请求设置超时时间
  • 原文地址:https://www.cnblogs.com/Raywang80s/p/3024261.html
Copyright © 2011-2022 走看看