ASP.NET MVC轻教程 Step By Step 13——页面布局

一般在一个网站中页面会使用相同的结构和元素,如果每个页面都要重复添加这些元素,不仅繁琐更会给我们后期维护带来大麻烦。所以我们采用网页模板之类的技术,将固定不变的元素放入模板,同时留下一些占位符供页面各自填充不同的内容。在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站点的可维护性打下良好的基础。这么好的工具是一定要用在我们的项目里的。

时间: 2024-10-12 14:52:10

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

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

在前面的教程里,细心的你可能会有个疑问,就是地址栏输入/Home/Write就可以进入留言页面.无论是静态HTML还是ASP/ASP.NET.PHP,URL都是和某个页面相关.比如假设有个URL是“www.xxx.com/index.aspx?id=1",浏览器请求的页面是index.aspx,同时带有名为id值为1的参数.那为什么输入/Home/Write可以进入留言页面?你可能会认为其中Write是与write.cshtml对应,其实不然,动作方法名与视图名相同是约定,并不是铁律,我们完全可

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

上一节我们使用原始的HTML表单来完成留言功能,但是ASP.NET MVC提供了丰富的HTML辅助方法来帮助我们构建更简洁优雅的表单. Step 1. 修改Form标签 首先,我们可以使用Html.BeginForm来创建form标签.这样我们可以将原来的表单改成如下代码. @{Html.BeginForm("Save", "Home"); } <label for="nickname">昵称</label> <in

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

前面两节使用的两种数据验证方法都是在服务器端进行的,也就是提交了表单,数据回传给服务器才能验证.这样会带来两个问题,一是用户体验不好,用户提交了表单之后才知道存在问题:二是会给服务器带来额外的压力.我们可以使用客户端验证来解决这两个问题. 客户端验证一般使用Javascript脚本,JQuery.validate就是一个不错的JQuery验证组件,很多项目都会用它来实现客户端验证. Step 1. 添加脚本 ASP.NET MVC对JQuery有很好的支持,实际上后者已经集成在前者里面了,新建一

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

现在我们要把Index视图的留言信息进行分页显示. Step 1. 创建路由 我们希望以类似地址http://localhost:41583/Page1来表示第一页,Page2表示第二页,以此类推.在RouteConfig.cs中已有一条默认路由,但不能满足匹配类似/Page1这样的URL.我们要添加一条新的路由规则. public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource

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

ASP.NET MVC中的Model(数据模型)主要包括定义数据结构.数据库读写.数据验证等等和对象处理相关的工作. 在解决方案资源管理器中找到Model文件夹,点击右键,添加一个新类,名为“Message”.包含三个属性:NickName(用户名).Content(内容).ReleaseDate(发布日期). public class Message { public string NickName { set; get; } public string Content { set; get;

ASP.NET MVC轻教程 Step By Step 3 ——使用ViewBag

在上一节我们创建了与Index动作方法对应的Index视图,那么Index动作方法该如何向Index视图传送数据呢?其中一个方法是使用ViewBag(视图包).让我们试试看. 在Index动作方法中添加一行代码. public ActionResult Index() { ViewBag.Today = DateTime.Now.ToLongDateString(); return View(); } Today是我们自己命名的,看起来好像是ViewBag的一个属性,但ViewBag是动态对象,

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

上一节我们将留言列表显示在Index视图里了,现在该添加一个留言的表单,好让用户自己添加留言. 首先在HomeController中添加一个名为“Write”的动作方法. public ActionResult Write() { return View(); } Write动作方法没什么好解释的,接下来添加对应的Write视图. 我们依然采用空的视图模板.在视图中添加如下HTML代码. <body> <h1>MVC留言板</h1> <form action=&q

[转] ASP.NET MVC 中你必须知道的 13 个扩展点

ScottGu 在其 最新的博文 中推荐了 Simone Chiaretta 的文章 13 ASP.NET MVC extensibility points you have to know,该文章为我们简单介绍了  ASP.NET MVC  中的 13 个扩展点.Keyvan Nayyeri(与Simone合著了 Beginning ASP.NET MVC 1.0 一书)又陆续发表了一些文章,对这13个扩展点分别进行深入的讨论.我将在以后的随笔中对这些文章逐一进行翻译,希望能对大家有所帮助.

Asp.net MVC访问母版页中嵌套的iframe页面时,如果session或cookie过期,登录验证超时怎样自动跳转到登录页

一般登录验证的过滤器中,使用验证过滤器的Redirect方法,将请求重定向到指定的URL.但是如果我们要访问的页面是一个嵌套在母版页中的iframe页面时,这种重定向只会对iframe页面凑效,也就是会将iframe也重定向到登录页,这样就有违我们的目的了.所以我就尝试了很多方法来实现让整个页面重定向到登录页的目标,接下里我就来分享一下我的心路历程~~如果想看解决方法,可以直接拉到最后,忽略我的啰啰嗦嗦~~ 首先,我尝试了替换掉Redirect,改用了Write方法,意在将指定字符串写入HTTP