有意义的参考: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. 开发常用之在webstorm中使用cmd

      而今前端开发经常与cmd打交道,如使用个npm什么的,如果老是在ide和cmd之间切换显得比较繁琐,众多前端利器中我最喜欢的就是webstorm,而webstorm中就可以直接使用cmd,如图1, ...

  2. SOAPUI使用教程-创建MockResponse步骤

    MockResponse测试步骤监听一个SOAP请求并返回一个预先配置的响应,然后再继续. 传入的请求的能被断言检查. 这种TestStep使用场景是例如: 客户端测试,验证传入的请求并返回假或不正确 ...

  3. Linux Kernel Oops异常分析

    1.PowerPC小系统内核异常分析 1.1  异常打印 Unable to handle kernel paging request for data at address 0x36fef31eFa ...

  4. QProcess怎么实时的读到output的信息

    在Qt里想与子程序通信, 一般都会用到QProcess这个类, 而且手册里也提到了很多通信的方法, 比如手册里的"Communicating via Channels". 我也不例 ...

  5. Android 图标尺寸与设计

    样例和图解 外框:整体大小 ↑ 边框:图标留白大小 ↓ 图标:外图标的大小 ↑ 阴影:阴影特效大小 ↓ 图形:内图标的大小 ↑ 可选视图权重:使用两种类型的图形尺寸可以达到统一的视觉权重(可选),   ...

  6. c#实现简单金山打字小游戏(源码)

    using GameDemo.Utils;using System;using System.Collections.Generic;using System.Linq;using System.Te ...

  7. 数据库 sql server

    1. if exists(select * from sys.objects where name='test') drop table test go create table test ( id ...

  8. 为动态添加的元素,绑定click事件

    全选和取消全选 $("#quanxuan").click(function(){ $("input[name='picCheck']").prop(" ...

  9. c++字符串

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至 ...

  10. javascript平时小例子⑨(小型抽奖功能)

    <!doctype html><html lang="en"> <head> <meta charset="utf-8" ...