[转]Asp.Net MVC之ViewData字典与ViewModel模式
2013-04-16 16:31
453 查看
当需要从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) %>
使用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) %>
相关文章推荐
- Asp.Net MVC之ViewData字典与ViewModel模式
- \t\tAsp.Net MVC之ViewData字典与ViewModel模式
- Asp.Net MVC之ViewData字典与ViewModel模式
- Asp.Net MVC之ViewData字典与ViewModel模式
- Asp.Net MVC之ViewData字典与ViewModel模式
- Asp.net MVC中的ViewData与ViewBag
- ASP.NET MVC 传值方法ViewData与ViewBag的区别
- 【转】Scott_ASP.NET MVC框架(第三部分) 把ViewData从控制器传到视图
- Asp.net MVC中的ViewData与ViewBag
- Asp.Net MVC使用ViewData导致双引号被转义的解决方法
- ASP.NET MVC中的ViewData和ViewBag的区别
- Asp.net MVC中的ViewData与ViewBag
- ASP.NET MVC ViewData.Eval() 方法
- asp.net MVC 如何在aspx页面的head标签里输出Key为常量的ViewData呢?
- ASP.NET MVC 5通过viewdata 向视图传递多个对象
- Asp.net MVC 示例项目"Suteki.Shop"分析之---ViewData
- 在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下:
- Asp.net MVC中ViewData与ViewBag的使用方法(改)
- ASP.NET MVC框架(第三部分): 把ViewData从控制器传到视图
- ASP.NET MVC 2.0 in Vs2010 :使用C# 4.0中使用动态类型来传递ViewData