首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解!
如下以HomeController控制器中的代码为例:
public ActionResult Sample()
{
ViewBag.Message = "MySampleView";
return View(); //注意这里是渲染Views目录下的Home子目录(通过HomeController中的Home来找到子目录Home)下视图名称为action名称值为Sample(public ActionResult Sample()为HomeControll声明的action名称为Sample)的视图,文件名为Sample.cshtml
public ActionResult Sample()
{
ViewBag.Message = "MySampleView";
return View(“MySampleView”);//注意这里是渲染Views目录下的Home子目录下视图名称为MySampleView的视图,文件名为MySampleView.cshtml。
}
public ActionResult Sample()
{
ViewBag.Message = "MySampleView";
return View(“~/Views/Example/Index.cshtml”);//这里是常数Views目录下的Example子目录下的视图Index的视图,文件名为Index.cshtml。
}
ViewData是一种字典数据类型。
Example:
ViewData[“CurrentTime”]=DateTime.Now;
ViewBag是一种动态数据类型(dynamic)。上面的ViewData赋值等价于下面的赋值
Example:
ViewBag.CurrentTime=DateTime.Now;
注意差异:如果ViewData中的key有空格是不能用ViewBag访问的,比如
ViewData[“full name”]是不能转换成ViewBag式的;另外就是ViewBag中的值是不能作为参数传递的,因为不确定数据类型,除非使用ViewData方式传参或者强制数据类型转换,比如
@Html.TextBox(“name”,ViewBag.name);这种写法编译是通不过的,需要改成如下两种形式,
@Html.TextBox(“name”,ViewData[“name”]);
@Html.TextBox(“name”,(string)ViewBag.name);
ViewData是一种ViewDataDictionary类型,并非仅仅是Dictionary类型,它有一个Model属性,可以用来在视图中获取指定的模型对象。例如用它来在视图中传递指定模型:
public ActionResult List()
{
var albums=new List<Album>();
for(int i=0;i<10;i++)
{
albums.Add(new Album{Title=”Album”+i})
}
return View(albums);
}
在后台需要先把View方法中的参数值赋给ViewData.Model属性。然后告知视图哪种类型的模型正在使用@model声明。注意这里需要输入模型类型的完全限定类型名(命名空间和类型名称),如下所示:
//参数值赋给ViewData.Model属性
@model IEnumberable<MVCApplication1.Models.Album>
<ul>
@foreach(Album p in Model)
{
<li>@p.Title</li>
}
</ul>
如果不想输出完整类型名可以使用using。
@using MVCApplication1.Models
//参数值赋给ViewData.Model属性
@model IEnumberable< Album>
<ul>
@foreach(Album p in Model)
{
<li>@p.Title</li>
}
</ul>
对于视图经常使用的命名空间,可以在View目录下的web.config中配置<add namespace="LYG.HelloWorld" />
Example:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
<add namespace="LYG.HelloWorld" />
</namespaces>
</pages>
</system.web.webPages.razor>
通过MVC的模型Model在传入视图时,往往有一个主视图多个从视图或其它无关信息比如登陆信息、用户权限信息等。我们可以考虑主视图声明到@model中,其它信息放到ViewData中。但这样做并非适合所有人开发需求,如要要严格控制视图流入的数据,就必须所有数据都是强类型,以便视图编写人员能智能感知。这里因此引入视图模型的概念,就是把所有数据再组合成一个模型成为视图模型传入到@model中,比如如下购物车视图模型包括主视图产品信息,其它信息总价格和显示给用户的消息的代码示例。
Public class shoppingCatViewModel
{
Public IEnumberable<Product> products{get;set} //主视图
Public decimal totalPrice{get;set;} //总价格
Public string message{get;set;} //显示给用户的消息
}
然后通过@model shoppingCatViewModel 向这个模型中强制性地输入一个视图。
今天的学习到此为此,下一课将详细介绍Razor语法。