有意义的参考:http://www.asp.net/web-pages/tutorials/working-with-pages/3-creating-a-consistent-look

Asp.net是怎样解决Consistent Layout问题的?是通过引入以下几个概念并提供相应的机制解决的:

  • Content Blocks,内容块,是包含html内容的文件,可以“插入”到其他页面中,一般不能直接访问,类似于Web Form中用户控件的概念;
  • Layout Pages,布局页面,是包含html内容的页面,可以在其中“插入”其他页面,也就是其内容可被“被插入的页面”共享,类似于Web Form中Master Page的概念;
  • Content Page,一般页面,可在其中使用RenderPage("content blcok文件路径")“插入”Content Block,可以使用@Layout="Layout page路径"引用Layout Page(如果Content Page页面同级或上级文件夹中存在_ViewStart.cshtml页面,则Content Page会继承该页面,该页面中一般会使用@Layout指令引用Layout页面),该页面在Layout Page页面出现的位置即Layout Page页面中RenderBody(Layout Page中只能定义一个RenderBody方法)方法出现的位置;
  • PartialView:

以上是MVC Layout机制的几个概念,在这几个概念中,Content Page是出于主动位置的,也就是说Content Page可以决定引用还是不引用、引用哪个Layout Page,Content Page(和Layout Page)可以决定是否定义Content Block,以及引用哪个Content Block。这些概念的应用依赖于以下方法:

  • RenderPage方法用于将Content Block"插入"到的其他页面,在其他页面中希望插入Content Block的位置调用RenderPage("content block文件路径")方法;
  • RenderBody方法用于在Layout pages中定义Content Page的位置;
  • Layout Pages页面中除了可以定义静态的被其他页面共享的内容之外,还可以预定义一些区域,其内容可以由引用该Layout Page的Content Page页面自行定义。方法是:在Layout Page页面通过调用RenderSection定义此由Content Page页面实现的区域,每个区域都有一个唯一的名称,通过在Content Page中使用@Section来定义该区域的具体内容。举例如下:
     在Layout page 中使用:
    @RenderSection("header", required: false)
    或者:
    @if (IsSectionDefined("header")) {
    @RenderSection("header")
    } 在Content Page中:
    @section header {
    <div id="header">
    Creating a Consistent Look
    </div>
    }

    一般来说,这种方式的使用场景可能不太多。

  • Content Page的PageData属性(Dictionary类型),用于在Content Blocks和Layout Pages之间共享数据。可参考上面链接中的“Passing Data to Layout Pages”部分。

以上方法中,无论是作为Content Blocks还是Layout Page,都是静态页面,也就是这些页面是预先定义好的,而非由Content Page对应的Action生成的(最多是该通过ViewBag传递动态数据),而非由另一个Action生成,通过以下方法,可以在页面中调用另外一个Action方法,从而生成该页面的部分内容:

  1. Html.Action:executes a separate controller action and displays the results. Action offers more fl exibility and re-use because the controller action can build a different model and make use of a separate controller context.
  2. Html.RenderAction: Html.RenderAction 与 Html.Action相同,但Html.RenderAction writes directly to the response (which can bring a slight efficiency gain).

这基本上就是全部的MVC Layout的概念了。

另外顺便说一下几个Rendering Helper的用法:

Asp.Net Razor中的Consistent Layout的更多相关文章

  1. 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

    如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...

  2. ASP.NET Core中使用Razor视图引擎渲染视图为字符串

    一.前言 在有些项目需求上或许需要根据模板生产静态页面,那么你一样可以用Razor语法去直接解析你的页面从而把解析的页面生成静态页,这样的使用场景很多,不限于生成静态页面,视图引擎为我们提供了模型到视 ...

  3. 【翻译】介绍 ASP.NET Core 中的 Razor Pages

    介绍 ASP.NET Core 中的 Razor Pages 原文地址:Introduction to Razor Pages in ASP.NET Core         译文地址:介绍 asp. ...

  4. ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考

    原文:Razor Syntax Reference 作者:Taylor Mullen.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:何镇汐 什么是 Razor? Razor 是一 ...

  5. Asp.Net Core-几行代码解决Razor中的嵌套if语句

    MVC开发中,经常会遇到在razor中插入简单的逻辑判断. @if (clientManager.IsAdmin) { if (!Model.Topic.Top) { <a asp-action ...

  6. ASP.NET MVC 3和Razor中的@helper 语法

    原文:http://kb.cnblogs.com/page/102191/ ASP.NET MVC 3支持一项名为"Razor"的新视图引擎选项(除了继续支持/加强现有的.aspx ...

  7. ASP.NET MVC 3: Razor中的@:和语法

    原文 ASP.NET MVC 3: Razor中的@:和语法 [原文发表地址] ASP.NET MVC 3: Razor’s @: and <text> syntax[原文发表时间] De ...

  8. ASP.NET Core Razor中处理Ajax请求

    如何ASP.NET Core Razor中处理Ajax请求 在ASP.NET Core Razor(以下简称Razor)刚出来的时候,看了一下官方的文档,一直没怎么用过.今天闲来无事,准备用Rozor ...

  9. (转)ASP.NET MVC 3和Razor中的@helper 语法

    转自:http://kb.cnblogs.com/page/102191/ ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写 ...

随机推荐

  1. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  2. POJ 2559 Largest Rectangle in a Histogram ——笛卡尔树

    [题目分析] 本来是单调栈的题目,用笛卡尔树可以快速的水过去. 把每一个矩阵看成一个二元组(出现的顺序,高度). 然后建造笛卡尔树. 神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵 ...

  3. ACM: FZU 2112 Tickets - 欧拉回路 - 并查集

     FZU 2112 Tickets Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u P ...

  4. ZooKeeper个人笔记Session管理

    Session 1.sessionId  <机器的SID,当前时间>生成一个sessionId,这是全局唯一的. 2.TimeOut 会话的超时时间,注意,这个值和客户端ZooKeeper ...

  5. gitlab 创建SSH Keys 报500错

    gitlab 创建SSH Keys 报500错 看了一下日志 root@322323:/home/git/gitlab/log# cat production.log Errno::ENOMEM (C ...

  6. ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 本文地址 :http://www.cnblogs.com/fengbo ...

  7. Cenos7 编译安装 Mariadb Nginx PHP Memcache ZendOpcache (实测 笔记 Centos 7.0 + Mariadb 10.0.15 + Nginx 1.6.2 + PHP 5.5.19)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.准备 1.1 显示系统版 ...

  8. context上下文 php版解释

    context翻译为上下文其实不是很好,只是翻译理解大概的作用,对于开发来说,context是对定义的使用的变量,常量或者说是配置, 部分的函数功能除了缺省值之外,往往需要手动设置一些定义量来配合当前 ...

  9. 原来 laravel 路由 参数可以为可选。。。 很灵活

    基本路由 您的应用程序的绝大多数路由将在 app/routes.php 文件中定义.Laravel 中最简单的路由由一个 URI 和一个闭包调用组成. 基本 GET 路由 复制代码代码如下: Rout ...

  10. Unity Aspect

    Unity封装的东西太多,所以在很多情况下回忽略这些基本的事情.游戏窗口的中Aspect是通过Game窗口中进行选择,但对于相机的Aspect Unity并没有暴露接口在设置界面中,至少在编辑器下进行 ...