View的约定

1.根据约定,Views目录下包含着每一个与Controller同名但是没有像Controller后缀的文件夹;因此对于控制器HomeController就对应在views目录下有个目录名为Home;

2.对于controller目录,在每个对应的View下都有若干个与controller内方法同名的view文件。这样view就与action方法有了基本的关联。

ViewData与ViewBag

1.从技术上讲,数据通过叫做ViewData的特殊集合类ViewDataDictionary来从controller传递到views的;

ex:ViewData[“CurrentTime”] = DateTime.Now;

2.ViewBag是对ViewData的一种动态封装,它可以像以下那样赋值;

ex:ViewBag.CurrentTime = DateTime.Now;

3.在对ViewBag与ViewData的选择上,实际上没有选择哪一个是最好,因为,ViewBag只是对于ViewData的语法糖,它们从技术的优越性上讲是一致的;这可以根据个人习惯而选择。

4.它们之间的不同

①ViewBag的关键字必须是有效的C#标示符,例如你可以把一个值放到ViewData[“Key With Spaces”],但是ViewBag要是用这样的关键字就无法通过编译

②动态的值不能被作为参数传递到扩展方法中去,C#编译器必须知道每一个参数的类型。

所以这中情况下就应该使用像ViewData[“Name”]或是(String)View.Name的方式

强类型视图

1.在你的Controller中,代码可能如下:

 
public ActionResult List() {
var albums = new List<Album>();
for(int i = ; i < ; i++) {
albums.Add(new Album {Title = "Product " + i});
}
ViewBag.Albums = albums;
return View();
}
而在View中
<ul>
@foreach (Album a in (ViewBag.Albums as IEnumerable<Album>)) {
<li>@a.Title</li>
}
</ul>
2.在Controller,你也可以不用ViewBag,而直接返回一个集合实体给View,这时就得添加引用了
ex:return View(albums)
而在View中,你只需要标记一下刚才传过来的实体类型,就可直接使用Model了
@model IEnumerable<MvcApplication1.Models.Album>
@foreach (Album p in Model) {
<li>@p.Title</li>
}

或者使用using的方式

@using MvcApplication1.Models
@model IEnumerable<Album>
<ul>
@foreach (Album p in Model) {
<li>@p.Title</li>
}
</ul>
在web.config文件中直接添加引用
<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.Routing" />
<add namespace="MvcApplication1.Models" />
</namespaces>
</pages>

视图模型

1.问题:当一个视图需要展示不同的数据,而这些数据并不直接来自于一个领域模型

2.解决:

①一种方法就是把一些额外数据放入到ViewBag中去

②当你想要控制数据在View的流动时,你就需要强类型来更好的利用智能提示。①的方法就不好,这就该我们的视图模型登场了,这个视图模型包含了你想要在View展示的所有信息。

 

Razor视图引擎

1.提供一种干净、轻量级、简单的视图引擎,它并不包含像Web Forms视图引擎那样的不整齐的句法。
2.提供了流畅的句法,把语法结构和额外特性压缩到最小,在你和你的视图标记之间尽可能的提供最少的句法,在代码和html标签中尽可能得提供平滑的过度。
ex:
@{
var items = new string[] {"one", "two", "three"};
}
<html>
<head><title>Sample View</title></head>
<body>
<h1>Listing @items.Length items.</h1>
<ul>
@foreach(var item in items) {
<li>The item name is @item.</li>
} </ul></html>

3.语法

在Razor中的关键转义字符就是@,@用来从代码到标记的转化。

@{
string rootNamespace = "MyApp";
}
<span>@rootNamespace.Models</span>
我们希望得到的是MyApp类下的Models属性值,结果却得到了(由于Razor认为@rootNamespace是代码表达式)
<span>MyApp.Models</span>
这时我们可以用括号来表达明确的含义
<span>@(rootNamespace).Models</span>
②对email的智能过滤,对于像
<span>support@megacorp.com</span>
Razor可以识别这种e-mail格式,并且不会把@megacorp.com当做有效的代码表达式
③括号的用途:在Razor当有语意不明确时,就用括号来让Razor明白你的意图。
 

特性

1.HTML的封装

@{
string message = "<script>alert('haacked!');</script>";
}
<span>@message</span>

类似于这种XSS恶意代码,Razor会直接渲染为封装过后的HTML代码,而不是去执行那些javascript代码;

②如果需要输出HTML标记,你要返回一个System.Web.IHtmlString的实例,这时Razor不会去封装它;你可以创建HtmlString的实例或者使用Html.Raw这个方便的方法。

③HTML的自动封装对于XSS有很好的减轻作用,但是并不满足用户输入javascript的情况,

ex:

<script type="text/javascript">
$(function () {
var message = 'Hello @ViewBag.Username';
$("#message").html(message).show('slow');
});
</script>

此时如果用户输入的用户名为:\x3cscript\x3e%20alert(\x27pwnd\x27)%20\x3c/script\x3e;

那么就会解析script标签从而对系统造成安全隐患。我们应该用@Ajax.JavaScriptStringEncode 来封装用户的输入

2.代码块

@foreach(var item in stuff) {<li>The item name is @item.</li>}

Razor理解HTML标记的结构,当<li>标签关闭时,它能够自动转换为代码,我们不需要来再用大括号来声明<li>便签的结束。

3.注释

@*
This is a multiline server side comment.
@if (showMessage) {
<h1>@ViewBag.Message</h1>
}
All of this is commented out.
*@

4.布局

①我们先写一个母版页

<!DOCTYPE html>
<html>
<head><title>@ViewBag.Title</title></head>
<body>
<h1>@ViewBag.Title</h1>
<div id="main-content">@RenderBody()</div>
</body>
</html>

它看起来像普通的Razor页面,但是预留了一个@RenderBody的占位符

②接下来我们就可以套用所写的母版页了

@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
View.Title = "The Index!";
}
<p>This is the main content!</p>

为母版页加入底部模块:<footer>@RenderSection("Footer")</footer>

<!DOCTYPE html>
<html>
<head><title>@ViewBag.Title</title></head>
<body>
<h1>@ViewBag.Title</h1>
<div id="main-content">@RenderBody()</div>
<footer>@RenderSection("Footer")</footer>
</body>
</html>

这时,之前的子页会抛出异常,因为所有使用了母版页的子页都需要定义Footer这部分,

@section Footer {
This is the <strong>footer</strong>.
}

③ViewStart

所有的子页都采用一个模板页会很枯燥并且难于维护,

每一个View的子目录下都会有一个_ViewStart.Cshtml页,它可以解决这种枯燥,这个页面的代码总是在相同的目录下先执行,并且这个原理适用于所有的子目录。

MVC自学系列之三(MVC视图-Views)的更多相关文章

  1. MVC自学系列之四(MVC模型-Models)

    ASP.NET MVC 提供了一系列工具和特性去使用仅仅定义的对象模型.你可以坐下来好好思考你将要解决的问题,并且写好C#类,当你准备好时就可以使用MVC提供的工具去为每一个实体构建标准的index. ...

  2. C# MVC 自学笔记—4 添加视图

    ==============================翻译============================== 在本节中,你将要修改 HelloWorldController 类,以便使 ...

  3. MVC自学系列之二(MVC控制器-Controllers)

      Controllers的职责 1.MVC模式中的Controllers的职责是对用户的输入做出响应,对用户的输入在实体上做一些变化.它关心的是应用的流动,处理传入的数据,并给相关的View提供数据 ...

  4. MVC自学系列之一(MVC入门篇)

      MVC是如何适用于ASP.NET中的 自从2002年ASP.NET 1.0版本的首次发布,就知道ASP.NET和Web Forms是同样一回事.ASP.NET由抽象两层类所支持: -->Sy ...

  5. C# MVC 自学笔记—2 MVC Movie简介

    MVC Movie是微软官方的一个MVC入门项目,我们可以跟着这个项目来实践入门 这是官方地址 http://www.asp.net/mvc/tutorials/mvc-4/getting-start ...

  6. OPEN(SAP) UI5 学习入门系列之三:MVC (下) - 视图与控制器

    继续来学习UI5的MVC模型吧,这次我们来探讨视图与控制器. 1 视图 在MVC中,视图用来定义和渲染UI.在UI5中,视图的类型是可以自定义的,除了以下预定义的四种视图类型之外,你也可以定制自己的视 ...

  7. MVC小系列(七)【分部视图中的POST】

    MVC小系列(七)[分部视图中的POST] 在PartialView中进行表单提交的作用:1 这个表单不止一个地方用到,2 可能涉及到异步的提交问题 这两种情况都可能需要把表单建立在分部视图上, 使用 ...

  8. ASP.NET Core 中文文档 第四章 MVC(3.1)视图概述

    原文:Views Overview 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩(Jack) ASP.NET MVC Core 的控制器可以利用 视图 返回格式化结果. 什么 ...

  9. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

随机推荐

  1. careercup-数组和字符串1.4

    1.4 编写一个方法,将字符串中的空格全部替换为“%20“.假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的”真实“长度. C++实现代码: #include<iostream> ...

  2. hdu2034java

    人见人爱A-B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. InnoDB还是MyISAM (摘录)

    两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和My ...

  4. 高性能爬虫为什么使用定制DNS客户端?

    DNS 解析是高性能网络爬虫的瓶颈,主要是因为: 1. 由于域名服务的分布式的特性,DNS解析可能需要多次的请求转发,有时需要几秒甚至更长的时间来解析出相应的IP 地址. 2. 现有的标准库对DNS解 ...

  5. NDK开发之日志打印

    要在NDK中打印日志,只需要以下三步: 一.在Android.mk中添加以下内容: LOCAL_LDLIBS := -lm -llog 或者 LOCAL_LDLIBS:=-L$(SYSROOT)/us ...

  6. U3D 抛物线的方法

    本文转载:http://www.manew.com/thread-44642-1-1.html 无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对 ...

  7. 分享:Svg文件转换为图片(调用 Inkscape 命令行)

    其实只是做了简单封装,可以方便进行批量转换. 获取Svg对象坐标的代码请看:根据svg节点对象类型和路径值转换坐标值, DrawingColor方法是进行颜色填充的. /// <summary& ...

  8. ZOJ 1004 Anagrams by Stack(DFS+数据结构)

    Anagrams by Stack 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4 题目大意:输入两个字符串序列,判 ...

  9. 一段C++代码想到的问题

    今天在学习<Unix环境高级编程>,第七章进程环境给出了一个进程的内存分布示意图,从下往上依次为“正文段->初始化数据->未初始化数据(默认初始化为0)->堆(从低地址到 ...

  10. PC10303/UVA10252

    一开始看错题啦,以为是最长公共字序列的变题,认真一看,原来是排列后的最长公共序列,本来想着排序后,从小到大共同就输出的,但是认真一想,根本没必要,我有bitmap啊!之后哗啦啦地码完了,发现一个神奇的 ...