一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦。所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各自填充不同的内容。在ASP.NET WebForm中这种技术叫母版页,在ASP.NET MVC中它叫布局。

Step 1. 添加布局页面

在Views目录下添加一个新的视图,名叫“MyLayout”,当然你也可以起别的名字。

将MyLayout.cshtml的HTML代码修改一下。

<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
@RenderSection("head")
</head>
<body>
<h1>ASP.NET MVC简易留言板</h1>
<div>
@RenderBody()
</div>
</body>
</html>

RenderBody和RenderSection都是布局中的占位符。RenderBody是主要的占位符,在布局页中只能有一个RenderBody。RenderSection可以存在多个,只要参数名不同就可以。

Step 2. 修改Index和Write视图

修改Index视图代码,以应用MyLayout布局页。

@model IEnumerable<MessageBoard.Models.Message>

@{
Layout = "~/Views/MyLayout.cshtml";
} @section head
{
<title>ASP.NET MVC简易留言板</title>
}
@Html.ActionLink("我要留言", "Write")
@foreach (var message in Model)
{
<p>@message.NickName</p>
<p>@message.Content</p>
<p>@message.ReleaseDate</p>
<br />
} @if (ViewBag.Page > 1)
{
@Html.ActionLink("上一页", "Index", new { page = ViewBag.Page - 1 })
}
@if (ViewBag.Page < ViewBag.TotalPages)
{
@Html.ActionLink("下一页", "Index", new { page = ViewBag.Page + 1 })
}

Layout = "~/Views/MyLayout.cshtml"指明了页面采用MyLayout作为布局。@section head节内的部分会放入@RenderSection("head") 占位符中,其余未指明的部分全部放入@RenderBody() 占位符中。同样我们修改一下Write视图。

@model MessageBoard.Models.Message

@section head
{
<title>ASP.NET MVC简易留言板-我要留言</title>
<script src="~/Scripts/jquery-2.1.4.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
} @using (Html.BeginForm("Write", "Home"))
{
@Html.LabelFor(m => m.NickName, "昵称")
@Html.TextBoxFor(m => m.NickName)
@Html.ValidationMessageFor(m => m.NickName)
<br /><br />
@Html.LabelFor(m => m.Content, "内容")
@Html.TextAreaFor(m => m.Content, 5, 50, null)
@Html.ValidationMessageFor(m => m.Content)
<br /><br />
<input type="submit" value="提交" />
}

可以看出使用布局后每个页面都简洁明了不少,但要注意使用布局的页面必须指明每个section节的内容,即使是空的,也要在页面代码里写出这个节。

现在我们可以看到应用布局后的Index和Write了。

Step 3. 指定全局布局

如果你嫌给每个页面单独指定布局麻烦的话,我们还可以指定一个默认的全局布局。

在Views目录下添加一个名为“_ViewStart.cshtml"的视图,视图代码很简单。

@{
Layout = "~/Views/MyLayout.cshtml";
}

这样无须给每个视图设定布局页了,如果有少数视图想搞特殊化也不要紧,在其页面再单独指定即可。

Step 4. 新视图指定布局

在添加视图的对话框中选择使用布局页。如果在_ViewStart中已经指定了布局页,就无须其他设置。如果想单独指定某个布局页,那么填入布局页的地址,或者点击文本框后面三个点的按钮选择你要的布局页。

布局可以大大简化视图的复杂度,为Web站点的可维护性打下良好的基础。这么好的工具是一定要用在我们的项目里的。

ASP.NET MVC轻教程 Step By Step 13——页面布局的更多相关文章

  1. ASP.NET MVC轻教程 Step By Step 1 ——入门

    使用ASP.NET MVC有一段时间了,本人还是非常喜欢ASP.NET MVC这个框架模式的.在经历了WebForm复杂粗暴的做法后,自然感觉简洁优雅的MVC清新可人,只不过WebForm和MVC的设 ...

  2. ASP.NET MVC轻教程 Step By Step 8——路由

    在前面的教程里,细心的你可能会有个疑问,就是地址栏输入/Home/Write就可以进入留言页面.无论是静态HTML还是ASP/ASP.NET.PHP,URL都是和某个页面相关.比如假设有个URL是“w ...

  3. ASP.NET MVC轻教程 Step By Step 12——客户端验证

    前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我 ...

  4. ASP.NET MVC轻教程 Step By Step 9——分页

    现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在 ...

  5. ASP.NET MVC轻教程 Step By Step 7——改进Write动作方法

    在上一节我们使用强类型视图改进Write视图获得更好的智能感知和代码重构,现在可以进一步的改进动作方法. Step 1. 数据模型绑定 在Save方法中我们使用Request来获取表单传送的值,其实可 ...

  6. ASP.NET MVC轻教程 Step By Step 6——改进表单

    上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.B ...

  7. ASP.NET MVC轻教程 Step By Step 2 ——View初探

    在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...

  8. ASP.NET MVC轻教程 Step By Step 4——Model、View和Controller

    ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Mess ...

  9. ASP.NET MVC轻教程 Step By Step 5——初识表单

    上一节我们将留言列表显示在Index视图里了,现在该添加一个留言的表单,好让用户自己添加留言. 首先在HomeController中添加一个名为“Write”的动作方法. public ActionR ...

随机推荐

  1. 课程助理For Windows(预览版,正方教务系统学生查分工具)

    其实盖子已经开发了一个功能更强大的版本,但是那个版本依然基于正方系统,也就是说只要正方系统跪了或者张院士在网站上做点手脚,这个小工具就会失效. 今天给大家的版本虽然功能及其简单.界面极端丑陋,但是通过 ...

  2. NVMe 图解

    http://www.ssdfans.com/?p=1143#rd&sukey=3997c0719f151520989740bb972a716fdb2dbab623808d16acd5075b ...

  3. Android开发之Activity(活动)

    在安卓中,Activity(活动)就是一个包含应用程序的用户界面的窗口.一个应用程序可以包含一个或多个Activity. 一般一个活动对应一个UI文件,即xml文件.创建活动一般是基础Activity ...

  4. Linux下搭建Oracle11g RAC(6)----安装Grid Infrastructure

    从此步骤开始,我们正式安装Grid软件: ① 以grid用户登录图形界面,执行/home/grid/grid/runInstaller,进入OUI的图形安装界面: ② 进入OUI安装界面后,选择第3项 ...

  5. mRemote配置

    配置完mRemote后 备份C:\Users\Administrator\AppData\Local\Felix_Deimel\mRemote\confCons.xml文件 覆盖到其他电脑可以直接使用

  6. (转)JS获取当前对象大小以及屏幕分辨率等

    Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...

  7. JavaScript单例模式

    一.什么是单例 意思是指获取的对象只有一份. 二.最通用的单例 任何时刻获取SingLeton.instance都是同一个对象 var SingLeton={ instance:{ property: ...

  8. JS1-属性操作

    属性操作语法 读操作:获取.找到 元素.属性名 写操作:“添加”.替换.修改 元素.属性名 = 新的值 元素.innerHTML => 读取元素里面所有的html代码 元素.innerHTML ...

  9. C#调用ActiveX控件

    背景:最近项目中需要用到ActiveX控件,项目是在.Net平台下开发的.因此就直接在项目中添加了对ActiveX控件的引用,添加引用成功.在代码中实例化类的实例也没有问题,但在调用其方法或属性时总是 ...

  10. windows 8 vpn 错误解决

    最近微软发布了Windows 8 RTM版,很多朋友也安装了,我当然也不例外.这几天就有不少朋友问我VPN连接无论怎么都说密码错误不能验证,于是,便连接VPN进行了下测试,如下: 配置好VPN,步凑不 ...