MVC View基础(转)
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> |
MVC View基础(转)的更多相关文章
- MVC View基础
View主要用于呈现数据.由于Controller和相关的Service已经处理完业务逻辑并将结果打包成model实体,View只需要怎么去获得model并将其转为Html 1选择需要渲染的视图 在上 ...
- 自学MVC开发基础
由于现在面试需求,我必须有点了解MVC开发基础,MVC是一个开发框架或者是一个开发模式,MVC让软件开发的过程大致切割成三个单元,分别是:Model(模型).View(试图).Controller(控 ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- 【记录】ASP.NET MVC View 移动版浏览的奇怪问题
ASP.NET MVC View 中的一段代码: <span id="span_Id">@Model.ID</span> 没什么问题吧,浏览器浏览正常,查看 ...
- View基础知识
一.View基础知识 View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,代表了一个控件 1.View的位置参数 View的四个属性:top(左上角纵坐标) left(左 ...
- 【MVC】 基础
[MVC] 基础 一. Controller ActionResult ContentResult 返回string类型 EmptyResult 空 FileContentResult ...
- ASP.Net MVC View
ASP.Net MVC View(视图) View视图职责是向用户提供界面.负责根据提供的模型数据,生成准备提供给用户的格式界面. 支持多种视图引擎(Razor和ASPX视图引擎是官方默认给出的, ...
- (转)MVC语法-基础
好久没有关注微软的开发了,今天看到了MVC3,顺便学习学习,我觉得Razor是个不错的做法,比使用<%%>简单多了,而且好看.首先“_”开头的cshtml文档将不能在服务器上访问,和asp ...
- C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数
C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...
随机推荐
- hdu 2438
Problem Description Mr. West bought a new car! So he is travelling around the city. One day he comes ...
- Server.MapPath() 解析
Server.MapPath获得的路径都是服务器上的物理路径,也就是常说的绝对路径 ./当前目录 /网站主目录 ../上层目录 ~/网站虚拟目录 1.Server.MapPath("/&qu ...
- hadoop中datanode无法启动
一.问题描述 当我多次格式化文件系统时,如 [hadoop@xsh hadoop]$ ./bin/hdfs namenode -format 会出现datanode无法启动,查看日志(/usr/loc ...
- py2exe生成exe后,运行exe时提示No module named * 的解决办法
一个pymssql 的程序在解释器上运行正常,但是用py2exe打包后,提示 ImportError: No module named _mssql 百度了半天无果,然后bing,结果bing还是比百 ...
- CC2530 PWM波形产生。
1.使用TIM3_CC1,相关联引脚P1_7 #define GPIOPWM() do{P1SEL |= 0x80;}while(0);#define GPIOCLOSEPWM() do{P1SEL ...
- Jasper_plug_install
1.open eclipse -> Help -> Eclipse Marketplace. 2.at new window, find jasper, will find Jaspers ...
- c#添加事物(全部执行和带保存点的执行)
全部执行 protected void Button2_Click(object sender, EventArgs e) { // 执行事务 SqlConnection con = new SqlC ...
- [UVA] 11991 - Easy Problem from Rujia Liu? [STL应用]
11991 - Easy Problem from Rujia Liu? Time limit: 1.000 seconds Problem E Easy Problem from Rujia Liu ...
- vc获取时间戳
CTime cTime = CTime::GetCurrentTime(); CString msg; msg.Format("%u",cTime .GetTime()); Afx ...
- 阵列卡,组成的磁盘组就像是一个硬盘,pci-e扩展出sata3.0
你想提升性能,那么组RAID0,主板上的RAID应该是软RAID,肯定没有阵列卡来得稳定.如果你有闲钱,可以考虑用阵列卡. 不会的.即使不能起到RAID的作用,起码也可以当作直接连接了2个硬盘.不会影 ...