Asp.net MVC4高级编程学习笔记-视图学习第一课20171009

时间:2023-12-10 11:08:56

首先解释下:本文只是对Asp.net MVC4高级编程这本书学习记录的学习笔记,书本内容感觉挺简单的,但学习容易忘记,因此在边看的同时边作下了笔记,可能其它朋友看的话没有情境和逻辑顺序还请谅解!

一、MVC控制器渲染视图的三种方式。

如下以HomeController控制器中的代码为例:

1、默认方式

public ActionResult Sample()

{

ViewBag.Message = "MySampleView";

return View();  //注意这里是渲染Views目录下的Home子目录(通过HomeController中的Home来找到子目录Home)下视图名称为action名称值为Sample(public ActionResult Sample()为HomeControll声明的action名称为Sample)的视图,文件名为Sample.cshtml

2、指定视图名称方式

public ActionResult Sample()

{

ViewBag.Message = "MySampleView";

return View(“MySampleView”);//注意这里是渲染Views目录下的Home子目录下视图名称为MySampleView的视图,文件名为MySampleView.cshtml。

}

3、指定不同目录下视图方式

public ActionResult Sample()

{

ViewBag.Message = "MySampleView";

return View(“~/Views/Example/Index.cshtml”);//这里是常数Views目录下的Example子目录下的视图Index的视图,文件名为Index.cshtml。

}

二、控制器通过ViewData和ViewBag向视图传递信息。

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语法。