Asp.Net MVC之ViewData字典与ViewModel模式

xiaoxiao2021-02-28  132

    当需要从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) %>

转载请注明原文地址: https://www.6miu.com/read-23519.html

最新回复(0)