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

 

首先解释下:本文只是对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语法。

posted @ 2017-10-10 08:47  shuyisheng  阅读(481)  评论(0编辑  收藏  举报