View主要用于呈现数据。由于Controller和相关的Service已经处理完业务逻辑并将结果打包成model实体,View只需要怎么去获得model并将其转为Html

1选择需要渲染的视图

在上一篇中GuestbookController:

public ActionResult Create()
{
       return View();
}

默认渲染的是Views/Guestbook/Create.cshtml. 当以无参形式调用View()时, Framework推断要渲染的视图的名称应该和Action的名称一致。然后在MVC管线中,ControllerActionInvoker执行ViewResult并且告知要渲染的View,同时Framework请求ViewEngineCollection去定位要渲染的View(默认情况下,先寻找Views/<Controller Name>目录,然后是Views/Shared 目录)

2View重写

指定视图名称来返回视图

public ActionResult TestJson() {
return View();
}
public ActionResult TestJsonContent() {
return View("TestJson");
}

甚至还可以指定视图的路径

return View("~/Views/SomeOtherDirectory/New.cshtml");

3传递数据给View

在MVC中,Model对象是指包含了数据的模型. Controller将Model传递给View以后, View对象中不应该做任何的业务逻辑处理, 仅仅根据Model对象做一些显示逻辑的处理.

传递Model对象时, 我们有两种选择:

1.传递一个弱类型的集合, 即成员为object类型的集合,  在View中需要将每个成员转换成我们需要的类型,比如int, string,自定义类型等.

2.传递强类型对象, 这些类型是我们自定义的. 在View中直接使用我们传递的强类型对象, 不需要再转换类型.

 

传递弱类型:

ASP.NET MVC框架定义了ViewContext类, 直译后是"View上下文", 其中保存和View有关的所有数据, 其中Model对象也封装在了此类型中.

ViewData集合和TempData集合都是用来保存Model对象的.在一个Controller的Action中, 我们可以用如下方式为这两个集合赋值:

public ActionResult <span style="color: #000000;">Create</span>()
 {
     ViewData["hasPermission"] = true;
     TempData["hasPermission"] = true;
     return View();
 }

在页面中, 使用如下方式使用这两个集合:@{bool hasPermission=(bool)ViewData["hasPermission"]}   @{bool hasPermission=(bool)TempData["hasPermission"]}

自MVC 3开始有一个新的ViewBag 动态特性,它主要是为了从Controller到view进行传值用的,类似有所使用的ViewData[] 字典类。它定义为Dynamic,意味着你能动态的set/get  值,增加任何数量的的额外字段而不需要强类型的检测。

        public ActionResult Create()
{
ViewBag.hasPermission = true;
return View();
}

在页面中, 使用如下方式@{bool hasPermission=(bool)ViewBag.hasPermission}

强类型

当使用基于Razor的视图时,视图默认继承两个类型:System.Web.Mvc.WebViewPage或者 System.Web.Mvc.WebViewPage<T>。泛型WebViewPage<T>继承自 WebViewPage,但是提供了一些非泛型WebViewPage类里没有的独特的补充。

下面展示了WebViewPage<T>的主干成员定义:

public class WebViewPage<TModel> : WebViewPage
{
public new AjaxHelper<TModel> Ajax { get; set; }
public new HtmlHelper<TModel> Html { get; set; }
public new TModel Model { get; }
public new ViewDataDictionary<TModel> ViewData { get; set; }
}

要使用强类型视图,首先你必须确保控制器动作正确设置了ViewData.Model。在清单3.4里,我们获取所有的留言记录,显示在列表页面,并传递个人档案的整个集合到View方法,此方法封装了对ViewData.Model属性的设置。

public ActionResult Index()
{
var mostRecentEntries = (from entry in _db.Entries
orderby entry.DateAdded descending
select entry).Take(20);
var model = mostRecentEntries.ToList();
return View(model);
}

在与这个动作相应的Index视图里,即使松散类型的WebViewPage类也能使用ViewData.Model属性。但是这个属性只是一个object类型,我们需要对它进行转换以便有效地使用它。作为替代方案,我们能用@model关键词指定模型的类型。

@using Guestbook.Models
@model List<GuestbookEntry>

ASP.NET MVC 3 Beta版中添加新@model指令以提供一个更干净简洁的方式来指明你想要在视图文件中引用强类型模型类。你现在只需在你的Razor视图文件的顶端写 上@model StrongModelType就行了, 再无需有一个@inherits或指定一个视图基类

例如:

@model MvcApplication5.Models.GuestbookEntry

@model IEnumerable<MvcApplication5.Models.GuestbookEntry>

转换为强类型后,要显示响应的数据是那么的简单,如:@Model.Message

4视图模板的选择

MVC提供了两种视图:Aspx, Razor:

使用.ASPX“代码碎块”的方式编写

我们需要在HTML标签中使用”<%= %>”来标记“代码碎块”:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<DemoRC.Models.DTO.TransferModelController.StrongTypedDemoDTO>"%>
...
<body>
    <fieldset>
        <legend>Fields</legend>
        <p>
            UserName:
            <%= Html.Encode(Model.UserName) %>
        </p>
        <p>
            UserPassword:
            <%= Html.Encode(Model.UserPassword) %>
        </p>
    </fieldset>
    <p>
        <%=Html.ActionLink("Edit", "Edit", new { /* id=Model.PrimaryKey */ }) %> |
        <%=Html.ActionLink("Back to List", "Index") %>
    </p>
</body>

仔细观察就可以发现上例中每一个代码碎块都需要5个字符(”<%= %>”)来标明代码的开始和结束位置。

使用Razor的语法编写

在Razor中,你只需要用一个”@”字符就可以标识代码块的开始,与”<% %>”代码碎块不一样,Razor不需要你显式指明代码块的结束位置:

<ol>
     <li>
         @Html.LabelFor(m => m.UserName)
         @Html.TextBoxFor(m => m.UserName)
     </li>
     <li>
         @Html.LabelFor(m => m.Password)
         @Html.PasswordFor(m => m.Password)
     </li>
     <li>
         @Html.CheckBoxFor(m => m.RememberMe)
         @Html.LabelFor(m => m.RememberMe, new { @class = "checkbox" })
     </li>
 </ol>

个人比较喜欢Razor,点击查看更多Razor介绍

MVC View基础的更多相关文章

  1. MVC View基础(转)

    View主要用于呈现数据.由于Controller和相关的Service已经处理完业务逻辑并将结果打包成model实体,View只需要怎么去获得model并将其转为Html 1选择需要渲染的视图 在上 ...

  2. 自学MVC开发基础

    由于现在面试需求,我必须有点了解MVC开发基础,MVC是一个开发框架或者是一个开发模式,MVC让软件开发的过程大致切割成三个单元,分别是:Model(模型).View(试图).Controller(控 ...

  3. ASP.NET MVC View 和 Web API 的基本权限验证

    ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...

  4. 【记录】ASP.NET MVC View 移动版浏览的奇怪问题

    ASP.NET MVC View 中的一段代码: <span id="span_Id">@Model.ID</span> 没什么问题吧,浏览器浏览正常,查看 ...

  5. View基础知识

    一.View基础知识 View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,代表了一个控件 1.View的位置参数 View的四个属性:top(左上角纵坐标)     left(左 ...

  6. 【MVC】 基础

    [MVC] 基础 一. Controller ActionResult ContentResult  返回string类型 EmptyResult     空 FileContentResult    ...

  7. ASP.Net MVC View

    ASP.Net MVC View(视图)   View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官方默认给出的, ...

  8. (转)MVC语法-基础

    好久没有关注微软的开发了,今天看到了MVC3,顺便学习学习,我觉得Razor是个不错的做法,比使用<%%>简单多了,而且好看.首先“_”开头的cshtml文档将不能在服务器上访问,和asp ...

  9. C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数

    C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...

随机推荐

  1. 基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?

    那些迷信设计模式的人,来修改一下这个方法吧.看看你最终的代码膨胀为几倍... public virtual PasswordChangeResult ChangePassword(ChangePass ...

  2. Spring MVC中Ajax实现二级联动

    今天写项目遇到了二级联动,期间遇到点问题,写个博客记录一下. 后台Controller: @RequestMapping("/faultType") @ResponseBody p ...

  3. plsql通过instantclient连接oracle数据库报连接超时

    配置:数据库oracle10.2;服务器操作系统centos5.5:客户机操作系统win7 32位:plsql版本10.0.5 配置前提必须关闭客户机与服务器操作系统的防火墙,否则会出现“连接超时”的 ...

  4. Linux C 程序 基础(FOUR)

    1.标识符:C语言本身不限制变量长度,但是某些编译器会限制变量长度,命名最好不要超过8位.         以数字开头,保留字,*,空格非法 2.关键字:类型说明符,int , 语句定义符,if el ...

  5. ASP.NET输入文本框自动提示功能

    在ASP.NET Web开发中会经常用到自动提示功能,比如百度搜索.我们只要输入相应的关键字,就可以自动得到相似搜索关键字的提示,方便我们快速的输入关键字进行查询. 那么在ASP.NET中,如果我们需 ...

  6. C语言到底怎么了?

    自2015年11月开始,所有C语言系列都呈现出衰落之势.在超过15年的时间里,C语言在编程语言排行榜中的占比一直有15%-20%,但今年却突然急转直下,目前占比已不足10%,且目前看来回天乏力. 那么 ...

  7. Linux查看目录挂载点

    用命令 df 即可 # df /var/lib/ Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda3 135979984 669 ...

  8. PHP提取身份证号码中的生日并验证是否成年的函数

    php 提取身份证号码中的生日日期以及确定是否成年的一个函数.可以同时确定15位和18位的身份证,经本人亲测,非常好用,分享函数代码如下: <?php //用php从身份证中提取生日,包括15位 ...

  9. Android全部权限详解(manifest.xml)

    当我们在写android程序时有很多功能都要在androidmanifest.xml中加入权限申明才能正常使用,下面就把所有的权限介绍一下: android.permission.ACCESS_CHE ...

  10. Cocos2dx坐标转换

    Cocos2dx坐标转换 这段时间加班有点猛,没有太多时间来写博客了,ok,继续完成任务: 前言 这里将会重点介绍四个函数: convertToNodeSpace convertToNodeSpace ...