C# MVC 自学笔记—4 添加视图
==============================翻译==============================
在本节中,你将要修改 HelloWorldController 类,以便使用视图模板文件来干净地封装生成客户端 HTML 响应的过程。
您将创建一个使用介绍与 ASP.NET MVC 3 的Razor 视图引擎的视图模板文件。基于 razor 视图模板有.cshtml文件扩展名,并提供优雅的方式来创建 HTML 输出使用的 C#。Razor 将编写视图模板所需的字符数和击键数降至最低,并使编码工作流快速、流畅。
目前该Index方法返回一条消息,是在控制器类中硬编码的字符串。更改Index方法,以返回一个View对象,如以下代码所示:
publicActionResultIndex(){returnView();}
上面的Index方法使用一个视图模板来生成 HTML 响应到浏览器。控制器方法 (也称为操作方法),如上述,Index方法通常返回一个(或从一个派生的类),不是基元类型喜欢的字符串。
在项目中,添加一个视图模板,您可以使用与该Index方法。执行此操作,Index方法内单击鼠标右键,并单击添加视图.

出现添加视图对话框。保留缺省值的方式并单击添加按钮:
创建的MvcMovie\Views\HelloWorld文件夹和MvcMovie\Views\HelloWorld\Index.cshtml文件。你可以看到他们在解决方案资源管理器中:
下面显示所创建的 Index.cshtml 文件:
![]()
在 <h2> 标记下添加下面的 HTML 代码。
<p>Hello from our View Template!</p>
下面显示了完整的MvcMovie\Views\HelloWorld\Index.cshtml文件。
@{ViewBag.Title="Index";}<h2>Index</h2><p>Hello from our View Template!</p>
如果您使用的是 Visual Studio 2012,请在解决方案资源管理器中右键单击Index.cshtml 文件,然后选择在页面检查器中查看.

页检查器教程包含了这一新工具的详细信息。
或者,运行应用程序并浏览到的HelloWorld控制器 (http://localhost:xxxx/HelloWorld)。在您的控制器中的Index方法没做很多工作 ;它只是执行 return View() 语句,其中指定该方法应使用一个视图模板文件来呈现到浏览器的响应。因为您不显式指定要使用的视图模板文件的名称,ASP.NET MVC 中默认为\Views\HelloWorld文件夹中使用Index.cshtml视图文件。下面的图像显示的字符串"Hello 从我们的视图模板!"在视图中硬编码。
![]()
看上去很不错。但是,请注意浏览器的标题栏显示"索引我 ASP.NET A"和页面顶部的大链接说"您的徽标在这里"。下面的链接"您的徽标在这里"。 注册和日志中的链接,和下面链接到首页,约和联系页面。让我们改变其中一些。
更改视图和布局页面
第一,您想要更改"您的徽标这里."在页面的顶部标题。该文本是常见的每一页。它是实际实现的在项目中,只有一个地方即使它出现在应用程序中的每一页上。转到/Views/Shared文件夹中的解决方案资源管理器并打开_Layout.cshtml文件。此文件被称为布局页面,它是所有其他页使用共享"壳"。

布局模板允许您在一个地方指定站点的 HTML 容器布局,然后将其应用在您的网站中的多个网页之间。找到 @RenderBody() 行。 RenderBody是在您创建的所有视图特定的页面都出现,在布局页面中的"包装"的占位符。例如,如果您选择关于链接,在RenderBody方法内呈现Views\Home\About.cshtml视图。
更改网站标题标题中的"MVC 电影"到布局模板从"你的 logo 在这里"。
<divclass="float-left"><pclass="site-title">@Html.ActionLink("MVC Movie", "Index", "Home")</p></div>
标题元素的内容替换为以下标记:
<title>@ViewBag.Title - Movie App</title>
运行该应用程序,并注意它现在说的"MVC 电影"。单击 关于 链接,也可以看到该页面如何显示"MVC 电影"。我们能够一次在布局模板进行更改,在该网站上的所有页面有都反映新的标题。

现在,让我们更改索引视图的标题。
打开MvcMovie\Views\HelloWorld\Index.cshtml。有两个地方可以更改:一个是显示在浏览器标题中的文本,另一个是显示在二级标题中的文本(<h2> 元素)。所以你可以看到哪位代码更改应用程序的哪一部分,你要让他们稍有不同。
@{ViewBag.Title="Movie List";}<h2>MyMovieList</h2><p>Hello from our View Template!</p>
若要指示显示的 HTML 标题,上面的代码设置ViewBag对象 (这是Index.cshtml视图模板中) 的Title属性。如果你回看布局模板的源代码,您会发现该模板使用此值<title>元素中作为我们以前修改过的 HTML <head>节的一部分。使用此ViewBag方法,您可以轻松地传递其他参数之间您的视图模板和您的布局文件。
运行该应用程序并浏览到http://localhost:xx/HelloWorld。请注意,浏览器的标题,主标题和二级标题已更改。(如果看不到更改浏览器中的,您可能查看缓存的内容。按 Ctrl + F5 在浏览器强制从服务器加载响应)。浏览器的标题创建的ViewBag.Title我们在Index.cshtml视图模板和附加设置"-电影 App"在布局文件中添加。
此外请注意如何Index.cshtml视图模板中的内容被合并了与_Layout.cshtml视图模板和单个 HTML 响应被发送到浏览器。布局模板,可真的很容易进行更改以应用跨所有应用程序中的页。
![]()
(在本例中的"从我们的视图模板 Hello!"消息) 中的"数据"我们一点是硬编码的不过。MVC 应用程序中有一个"V"(视图) 和你有一个"C"(控制器),但没有"M"(模型) 尚未。不久,我们就会走过如何创建数据库并从中检索模型数据。
将数据从控制器传递到视图
不过,在转到数据库并讨论模型之前,让我们先了解一下将信息从控制器传递到视图。控制器类调用传入的 URL 请求的响应。控制器类是响应的哪里你写处理传入的浏览器的代码请求,从数据库中检索数据和最终决定何种类型发送回浏览器。查看模板然后可从控制器生成并设置其格式到浏览器的 HTML 响应。
控制器负责提供任何数据或对象必需的一个视图模板来呈现到浏览器的响应。最佳做法是:一个视图模板应永远不执行业务逻辑或与数据库直接进行交互。相反,一个视图模板应该只能使用由控制器提供给它的数据工作。保持这种"关注分离"可帮助保持您的代码的清洁、 可测试和更易维护。
目前,在 HelloWorldController类中的Welcome的操作方法需要一个name和一个numTimes参数,然后输出直接到浏览器的值。而不是有呈现此响应作为字符串的控制器,让我们改变的控制器,而使用一个视图模板。该视图模板将生成动态响应,这意味着你需要传递的数据的适当位从控制器到视图以便生成响应。你可以通过把视图模板需要的动态数据 (参数) 放在一个ViewBag对象,然后,视图模板可以访问对象的控制器。
返回到HelloWorldController.cs文件和更改的 Welcome的方法,将一个Message和NumTimes值添加到 ViewBag对象。ViewBag是一个动态的对象,这意味着你可以随便你向它提出 ;在添加属性之前,ViewBag 对象没有已定义的属性。ASP.NET MVC 模型绑定系统自动将地址栏的查询字符串中的命名参数(name 和 numTimes)映射到您的方法中的参数。完整的HelloWorldController.cs文件看起来像这样:
usingSystem.Web;usingSystem.Web.Mvc;namespaceMvcMovie.Controllers{publicclassHelloWorldController:Controller{publicActionResultIndex(){returnView();}publicActionResultWelcome(string name,int numTimes =1){ViewBag.Message="Hello "+ name;ViewBag.NumTimes= numTimes;returnView();}}}
现在的ViewBag对象包含将自动传递给视图的数据。
下一步,你需要一个欢迎视图模板 !在生成菜单中,选择生成 MvcMovie ,以确保编译项目。
在Welcome方法内右键单击然后单击添加视图.

这里是添加视图对话框中的样子:
单击添加,然后将下面的代码在 <h2>元素下添加新的Welcome.cshtml文件中。您将创建一个循环,多少倍,用户说它应该说"Hello"。下面显示了完整的Welcome.cshtml文件。
@{ViewBag.Title="Welcome";}<h2>Welcome</h2><ul>
@for (int i=0; i < ViewBag.NumTimes; i++) {
<li>@ViewBag.Message</li>}</ul>
运行该应用程序并浏览到以下 URL:
http://localhost:xx/HelloWorld/欢迎? 名称 = 斯科特 & numtimes = 4
现在的数据是采取从 URL 和传递给使用模型联编程序的控制器。控制器将数据打包成一个 ViewBag 对象,并将该对象传递给视图。视图作为 HTML 然后显示该用户的数据。
![]()
在上面的示例中,我们使用一个ViewBag对象,将数据从控制器传递到视图。后者在本教程中,我们将使用一个视图模型将数据从控制器传递到视图。将数据传递到视图模型方法优于一般多视图袋方法。
请参阅博客动态 V 强类型化视图的详细信息。
嗯,那是"M"的一种模型,但不是数据库的那种。让我们利用所学的知识来创建一个影片的数据库。
==============================翻译==============================
控制器负责提供任何数据或对象必需的一个视图模板来呈现到浏览器的响应。
最佳做法是:一个视图模板应永远不执行业务逻辑或与数据库直接进行交互。相反,
一个视图模板应该只能使用由控制器提供给它的数据工作。
保持这种"关注分离"可帮助保持您的代码的清洁、 可测试和更易维护。
这段话很重要,这样主要的业务逻辑保留在 控制器层,为以后的维护比较方便
viewbag 翻译成视图包 比较安全
viewbag 就好像我们的临时全局变量一样 可以临时存放N多的东西
C# MVC 自学笔记—4 添加视图的更多相关文章
- C# MVC 自学笔记—5 添加模型
==============================翻译============================== 在本节中,您将添加一些类来管理数据库中的电影.这些类将 ASP.NET M ...
- C# MVC 自学笔记—6 编辑方法和编辑视图
==============================翻译============================== 运行该应用程序并浏览到Movies控制器通过将/Movies追加到您的浏览 ...
- C# MVC 自学笔记—2 MVC Movie简介
MVC Movie是微软官方的一个MVC入门项目,我们可以跟着这个项目来实践入门 这是官方地址 http://www.asp.net/mvc/tutorials/mvc-4/getting-start ...
- MVC学习笔记(三)—用EF向数据库中添加数据
1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...
- 创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图
创建ASP.NET Core MVC应用程序(4)-添加CRUD动作方法和视图 创建CRUD动作方法及视图 参照VS自带的基架(Scaffold)系统-MVC Controller with view ...
- ASP.NET MVC系列:添加视图
虽然在上一篇文章中我们知道通过控制器可以在浏览器输出HTML页面,但是这不是控制器主要干的事,因为页面上我为还要做很多好看的特效,页面展示的事情当然交给视图来做了:下面我们就来看看如何添加一个视图 添 ...
- [Asp.net MVC]Asp.net MVC5系列——添加视图
目录 系列文章 概述 添加视图 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 概述 在这一部分我们添加一个新的控制器HelloWorldController类, ...
- ASP.NET MVC 5 学习教程:添加视图
原文 ASP.NET MVC 5 学习教程:添加视图 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 通过控 ...
- 【译】ASP.NET MVC 5 教程 - 3:添加视图
原文:[译]ASP.NET MVC 5 教程 - 3:添加视图 在本节内容中,我们将修改HelloWorldController类,使用视图模板来干净利索的封装生成HTML响应客户端的过程. 您将创建 ...
随机推荐
- utf8_general_ci 、utf8_general_cs和utf8_bin的区别
用了这么长时间,发现自己竟然不知道utf_bin和utf_general_ci这两者到底有什么区别..ci是 case insensitive, 即 "大小写不敏感", a 和 A ...
- 基于Visual C++2013拆解世界五百强面试题--题8-数组的排序和查找
用三种方法实现对一个数组的排序,并设计一个函数实现数的查找,要求时间越短越好,空间占用越少越好. 对数组排序的方法很多,我们选比较常用和容易的三种排序,直接插入排序,冒泡排序和快速排序. 直接插入排序 ...
- HDU 1847 Good Luck in CET-4 Everybody!
题解:巴什博弈,2^k+1=3N或2^k2=3N,所以3N为P-position,3N+r为N-position. #include <cstdio> int main(){ int n; ...
- uva11536 Smallest Sub-Array
Thinking about it: 我的思路跟sliding window有点类似.假设已经确定了一个区间[l, r],序列中从 l 到 r 恰好包含了[1, K]的各个元素,则从 r 开始继续迭代 ...
- 意大利奢侈品牌-Kiton 华丽进驻北京新光天地-时尚生活-泛高尔夫网
意大利奢侈品牌-Kiton 华丽进驻北京新光天地-时尚生活-泛高尔夫网 意大利奢侈品牌-Kiton 华丽进驻北京新光天地
- jQuery EasyUI 数字框(NumberBox)用法
这里的options是选项,可以参考下表: 选项名 类型 描述 默认值 min 数字 文本框中可允许的最小值 null max 数字 文本框中可允许的最大值 null precision 数字 最高可 ...
- 优雅的python
在知乎上看到的问题--python有哪些优雅的代码实现. 下面的代码大概也算不上优雅. 一下代码在python3中实现 更多内容可见:http://book.pythontips.com/en/lat ...
- 阿里云部署 Flask + WSGI + Nginx 详解
抵不住朋友的诱惑,今天终于入手了一台阿里云服务器,是Ubuntu 1.4 32位版本,最初考虑是用来尝尝鲜只是买了个最低配的,价格算起来与在国外买个空间的价格相当吧(可能一年才贵100多),但用起来感 ...
- 织梦dedecms|文章模型内容页标签
文章标题:{dede:field.title/}文章链接:{dede:field name='arcurl'/}发布时间:{dede:field.pubdate function="MyDa ...
- codeforces 464B Restore Cube
题目链接 给8个点, 判断这8个点能否组成一个正方体, 如果能, 输出这8个点. 同一个点的x, y, z可以交换. 每一个点有6种排列方式, 一个8个点, 暴力枚举出所有排列方式然后判断能否组成正方 ...