在本节中,你要去修改HelloWorldController
类,使用视图模板文件,以干净利索地封装的过程中,客户端生成HTML响应。
您将创建一个视图模板文件使用Razor视图引擎 。 剃刀模板。CSHTML的文件扩展名,提供一种优雅的方式使用C#创建HTML输出。 剃须刀一个视图模板时,需要记录的字符和按键的数量降至最低,并能够进行快速的,流体的编码工作流。
目前的Index
方法返回一条消息,是在控制器类中硬编码的字符串。 更改Index
方法返回一个View
对象,如下面的代码所示:
public ActionResult Index() { return View(); }
上述Index
的方法使用视图模板生成一个HTML的响应浏览器。 控制器的方法(也被称为行动方法 ),如上面的Index
方法,一般情况下返回的ActionResult (或一类来自的ActionResult ),而不是原始类型,如字符串。
首先,创建一个视图文件夹的HelloWorld控制器。 右键单击视图 ,单击“ 添加”,然后单击“ 新建文件夹”。
命名文件夹的HelloWorld。
的HelloWorld文件夹中右键单击,然后单击“ 添加 ”,然后单击“ 脚手架”。
的MvcMovie \浏览\的HelloWorld \ Index.cshtml文件被创建。
下面显示了Index.cshtml文件创建:
添加以下HTML下<h2>
标签。
<p>Hello from our View Template!</p>
完整MvcMovie \浏览\的HelloWorld \ Index.cshtml文件如下所示。
@{ ViewBag.Title = "Index"; } <h2>Index</h2> <p>Hello from our View Template!</p>
Index.cshtml文件右键单击并选择“ 查看”页督察 。
您也可以右击Index.cshtml文件,并选择“ 在浏览器中查看。有关更多信息,请参阅页督察教程 。
另外,运行应用程序和浏览到HelloWorld
控制器(http://localhost:xxxx/HelloWorld)。 在你的控制器方法的Index
并没有做太多的工作,它只是运行语句return View()
指定该方法应该使用一个视图模板文件呈现到浏览器的响应。 因为你没有明确指定ASP.NET MVC视图模板文件使用的名称,拖欠Index.cshtml视图文件使用\浏览\ HelloWorld的文件夹中。 下面的图片显示字符串“Hello,从我们的视图模板!” 硬编码在视图中。
看起来还不错。 但是,请注意浏览器的标题栏中显示“索引我的ASP.NET应用”,页面顶部的大环上说:“应用程序名称。” 根据多么小,你让你的浏览器窗口中,您可能需要在右上角单击“三条杠”,看到首页 , 关于我们 , 联系方式, 注册 , 登录链接。
首先,你要改变在页面顶部的“应用程序名”链接。 文本是常见的每一页。 它实际上是在项目实施中,只有一个地方,即使它出现在每个页面中的应用。 转到/查看/共享文件夹在解决方案资源管理器中,打开_Layout.cshtml文件。 此文件被称为布局页 ,它是所有其他网页使用的共享文件夹。
布局模板允许您指定您的网站的HTML容器布局在一个地方,然后将其应用在您的网站在多个页面。 查找@RenderBody()
线。 RenderBody
是一个占位符,所有的特定视图创建页面中显示,“包装”在布局页。 例如,如果您选择的关于链接, 查看\首页\ About.cshtml视图内呈现RenderBody
方法。
在布局模板“应用程序名称”更改的ActionLink “MVC电影”。
<body> <div class="navbar navbar-inverse navbar-fixed-top"> <div class="navbar-inner"> <div class="container"> <button type="button" class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> @Html.ActionLink("MVC Movie", "Index", "Home", null, new { @class = "brand" }) <div class="nav-collapse collapse"> <ul class="nav"> <li>@Html.ActionLink("Home", "Index", "Home")</li> <li>@Html.ActionLink("About", "About", "Home")</li> <li>@Html.ActionLink("Contact", "Contact", "Home")</li> </ul> @Html.Partial("_LoginPartial") </div> </div> </div> </div>
title元素的内容替换为以下标记:
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title - Movie App</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head>
运行应用程序并注意到它现在说“MVC电影”。 关于点击链接,你看怎么样,页面显示“MVC电影”,也。 我们能够做出改变一次在布局模板,并在网站上的所有页面反映新的标题。
现在,让我们改变索引视图的标题。
开放MvcMovie \查看\的HelloWorld \ Index.cshtml。 有两个地方做出改变:第一,在浏览器的标题显示的文本,然后在二级头(的<h2>
元素)。 所以你可以看到,你会让他们略有不同位代码更改应用程序的一部分。
@{ ViewBag.Title = "Movie List"; } <h2>My Movie List</h2> <p>Hello from our View Template!</p>
要注明的HTML标题显示,上面的代码中设置一个Title
属性的的ViewBag
对象(这是在Index.cshtml视图模板)。 请注意,布局模板(\共享\ _Layout.cshtml)中使用此值在<title>
元素的HTML,我们修改了以前的<head>
部分的一部分。
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>@ViewBag.Title - Movie App</title> @Styles.Render("~/Content/css") @Scripts.Render("~/bundles/modernizr") </head>
ViewBag
使用此方法,你可以很容易地通过其他参数之间的视图模板和布局文件。
运行应用程序。 请注意,浏览器标题,主标题,二级标题已经改变。 (如果你没有在浏览器中看到的变化,你可能会被查看缓存的内容,按Ctrl + F5在浏览器中强制要加载来自服务器的响应。)与设置ViewBag.Title
我们创建浏览器标题Index.cshtml视图模板和额外的“ -电影APP补充说:”在布局文件中。
同时注意到Index.cshtml视图模板中的内容如何被合并的的_Layout.cshtml视图模板和一个HTML响应发送给浏览器。 布局模板,使得它很容易进行修改适用于所有在你的应用程序的页面。
我们点点的“数据”(在这种情况下,“从我们的视图模板!”消息)是硬编码的,虽然。 MVC应用程序有一个“V”(视图),你已经有了一个“C”(控制器),但没有“M”(模型)还。 不久,我们将演练如何创建一个数据库和检索模型数据。
在我们去一个数据库和模型谈,不过,让我们先说说从控制器到视图的信息传递。 调用控制器类传入URL请求的响应。 一个控制器类是你写的代码处理传入的浏览器请求,从数据库中检索数据,并最终决定什么类型的响应发送回浏览器。 视图模板可以被用来从控制器到浏览器的HTML响应的生成和格式化。
控制器负责提供的任何数据或对象中需要为了一个视图模板呈现到浏览器的响应。 最好的做法: 不应该执行业务逻辑视图模板或直接与数据库交互 。 相反,视图模板应该只由控制器,提供给它的数据。 保持这种“关注点分离”有助于保持代码的整洁,可测试性和更容易维护。
目前,的Welcome
动作方法,在HelloWorldController
类需要一个name
和一个numTimes
参数的,然后直接与浏览器输出的值。 而非控制器使这个作为一个字符串响应,让我们的控制器更改为模板,而不是使用一个视图。 视图模板会生成一个动态响应,这意味着你需要通过相应的位数据从控制器中的视图来生成响应。 你可以做到这一点通过控制器把动态数据(参数),视图模板需要ViewBag
对象在一个视图模板,然后可以访问。
返回的HelloWorldController.cs文件,并改变Welcome
方法来添加一个Message
和的NumTimes
值ViewBag
对象。ViewBag
是一个动态的对象,这意味着你可以把任何你想要它ViewBag
对象没有定义的属性,直到你把它里面的东西。ASP.NET MVC模型绑定系统自动映射的命名参数( name
和numTimes
)从你的方法在地址栏的查询字符串中的参数。完整HelloWorldController.cs文件看起来像这样:
using System.Web; using System.Web.Mvc; namespace MvcMovie.Controllers { public class HelloWorldController : Controller { public ActionResult Index() { return View(); } public ActionResult Welcome(string name, int numTimes = 1) { ViewBag.Message = "Hello " + name; ViewBag.NumTimes = numTimes; return View(); } } }
现在ViewBag
对象包含的数据将被自动传递给视图。
接下来,你需要一个Welcome视图模板! 在生成菜单中,选择“ 生成解决方案 (或按Ctrl + Shift + B),以确保项目被编译。
右键点击次数\ HelloWorld的文件夹,并单击“ 添加 ”,然后单击“ 脚手架”。
在“添加视图”对话框,命名视图。 在模板项中,选择“ 空”(模型),其他设置保持默认值,然后单击“ 添加”。
该MvcMovie \查看\ HelloWorld的\ Welcome.cshtml文件被创建。
添加下面的代码下<h2>
元素在新Welcome.cshtml文件。 您将创建一个循环,说“你好”,多次作为用户说,它应该。 完整Welcome.cshtml文件如下所示。
@{ ViewBag.Title = "Welcome"; } <h2>Welcome</h2> <ul> @for (int i = 0; i < ViewBag.NumTimes; i++) { <li>@ViewBag.Message</li> } </ul>
运行应用程序并浏览到以下网址:
http://localhost:xx/HelloWorld/Welcome?name=Scott&numtimes=4
现在,数据取自该URL,并传递给控制器,使用模型粘合剂 。 控制器包数据到ViewBag
对象,通过该对象的观点。 的视图以HTML格式的数据,然后显示给用户。
在上面的示例中,我们使用了ViewBag
对象从控制器将数据传递到一个视图。 后者在本教程中,我们将使用视图模型数据从控制器传递到视图。 视图模型传递数据的方法通常更喜欢在查看购物袋的方法。 请参阅博客条目的动态V强类型查看更多信息。
嗯,这是一个“M”模式的一种,但不是数据库类。 让我们学到什么,并创建一个电影数据库。
2013/9/17 15:08:25 | ASP.NET MVC入门基础教程 | |