本文参考自下面文章整理

MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction - kuangkro - 博客园 http://www.cnblogs.com/xlhblogs/archive/2013/06/09/3129449.html

MVC4 Razor @RenderSection -母版设置 - hcf_force的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/hcf_force/article/details/18702113

MVC4相关Razor语法 - hcf_force的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/hcf_force/article/details/18698751

MVC视图文件中的 @section ScriptSection{}是什么意思

如果布局页面有定义节点 @RenderSection(“ScriptSection”, required: false) ,那么在子页面中可以使用 @section ScriptSection{} 来引用js或者css。这个作用相当于在布局页中定义了一个占位,在子页面中去填充这个占位


  1. 了解ASP.NET MVC - 应用程序文件夹以及对每个文件夹内容的简要描述

  2. ASP.NET MVC - 样式和布局

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")"></script>
</head>
<body>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Movies", "Index", "Movies")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
</ul>
<section id="main">
@RenderBody()
<p>Copyright W3schools 2012. All Rights Reserved.</p>
</section>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • HTML 帮助器 在上面的代码中,HTML 帮助器用于修改 HTML 输出: @Url.Content() - URL 内容在此处插入。 @Html.ActionLink() - HTML 链接在此处插入。

  • Razor 语法 在上面的代码中,由红色标记的代码是使用 Razor 标记的 C#。 @ViewBag.Title - 在此处插入页面标题。 @RenderBody() - 此处呈现页面内容。 您可以在我们的 
    Razor 教程中学习 C# 和 
    VB (Visual Basic) 编写的 Razor 标记。

  • _ViewStart 文件 
    Shared 文件夹(位于 Views 文件夹内)中的 _ViewStart 文件包含以下内容: @{Layout = “~/Views/Shared/_Layout.cshtml”;} 这段代码被自动添加到由应用程序显示的所有视图。 
    如果删除该文件,则必须向所有视图添加这段代码。

    这里的 @{Layout=”文件路径”;} 代码块指定了整个项目默认所使用的布局文件

  • 1
  • 1

3.假如你不想使用默认的布局,或者是你的web应用有多个页面布局文件怎么办呢

其实很简单,例如:你新建了一个view页面UserInfo.cshtml,你可以在UserInfo.cshtml文件里面写上
@{Layout = null;}
  • 1
  • 1
就可以了,这个时候就不会应用布局文件了,假如你想定义一个新的布局(依照惯例优先的原则),我们在Views/Shared下面创建一个自己的布局_MyLayout.cshtml文件,然后我们给我们创建的新页面指定如下的布局就行了:
@{ Layout = "~/Views/Shared/_MyLayout.cshtml";}
  • 1
  • 1

详情 下一篇 MVC4 利用Layout的几种方法的Demo - 钢ge的博客 - 博客频道 - CSDN.NET

4.Razor语法的分类

基本语法

@using :引入命名空间

@model:声明强类型的数据Model类型

@section:定义要实现母版页的节信息

@RenderBody():当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合并,而新创建视图的内容会通过_Layout.cshtml布局页面的@RenderBody()方法呈现在标签之间。

@RenderPage:呈现一个页面。比如网页中固定的头部可以单独放在一个共享的视图文件中,然后在布局页面中通过这个方法调用,用法如下:

@RenderPage("~/Views/Shared/_Header.cshtml")  

带参数
@RenderPage(“~/Views/Shared/_Header.cshtml”,new{parm="my",parm2="you")
调用页面获取参数:
//获取 RenderPage() 传递过来的参数
@PageData["param"]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

@RenderSection:布局页面还有节(Section)的概念,便于局部呈现 。 
@RenderSection("scripts", required: false)第一个参数:在子页面被渲染的节的名称,第二个参数:指定子页面这个节是否是必需的,如果指定了required:true但是在子页面没有给这个名称的节的话,编译是通不过的。 
如果我们想在母版页使用默认的节可以做如下的判断:

@if(IsSectionDefined("sectionName"))
{
@RenderSection("sectionName")
}
else
{
<span>默认节</span>
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

假如子页面有这个节我们就渲染子页面的,没有的话就显示我们默认的Html块(例如:网站的头部,底部,侧边栏等等)。如果对@RenderSection还不是很理解看更详细的 MVC4 Razor @RenderSection -母版设置 - hcf_force的专栏 - 博客频道 - CSDN.NET

@Html.Partial

  • Partial 每次都会创建自己的 TextWriter 实例并且把内容缓存在内存中. 最后把所有 writer输出的内容发送到一个 MvcString对象中。更多时候我们会使用 @{ Html.RenderPartial("Details"); } 而不是@Html.Partial

@Html.RenderPartial()与 @Html.Partial的区别

  • Html.RenderPartial 直接输出至当前 HttpContext(因为是直接输出,所以性能好)。
  • Html.Partial 将视图内容直接生成一个字符串并返回(相当于有个转义的过程)。

@Html.RenderPage()和@Html.RenderPartial()的区别

  • @Html.RenderPage()调用的页面只能使用其传递过去的数据。

  • 而@Html.RenderPartial()是可以使用viewdata,model等数据的。

如:@{Html.RenderPartial("BasicChart",model);} 
  用这个重载可以在部分视图里使用强类型,然后在主视图中使用第二个参数传model过去

  @{Html.RenderPartial("BasicChart",ViewData["myData"]);}

@Html.RenderPartial和@Html.RenderAction的区别

  • Html.RenderPartial适合用在重覆使用的UserControl,并且只需要透过Model来呈现内容,或是对于广告的UserControl也适合使用。

  • Html.RenderAction则会先去呼叫Controller的Action方法,如果此UserControl是需要透过资料库取得资料来呈现(透过Action来读取资料库),此时会比较适合使用此方式。

补充:

  • 1、带有Render的方法返回值是void,在方法内部进行输出;不带的返回值类型为MvcHtmlString,所以只能这样使用: @Html.Partial 对应 @{Html.RenderPartial(….);} @Html.Action 对应 
    @{Html.RenderAction(….);}

  • 2、Html.Partial可以直接提供用户控件名作为参数,而Html.Action需要有对应的Action,在Action内部返回PartailResult(即retun 
    PartialView())。

  • 3、对于简单的没有任何逻辑的用户控件,推荐使用Html.Partial;对于需要设置一些Model的用户控件,推荐使用Html.Action。当然,有Model数据也是可以使用Html.Partial方法的,可以看方法的重载。

  • 4、使用Html.Action有个好处,就是可以根据不同的场景选择不同的用户控件。 比如: @Html.Action(“UserInfoControl”) 
    在对应的UserInfoControl这个Action中,在用户未登录的时候,可以retun 
    PartialView(“LogOnUserControl”);登录后,可以retun 
    PartialView(“UserInfoControl”);

@Html.Action() 
Partial Page Output Caching(部分页输出缓存)

我们可以使用@Html.Action()来请求一个处理方法,并将放返回的Model或者ViewModel对象渲染到页面 
 
 
通过使用OutputCache特性,我们实现了对对象的缓存。因此当发生重复请求时,就可以自动输出缓存信息避免频繁查询数据库,减轻服务器负担和提高响应速度

1.行内(inline)C#(服务器端代码)形式(行内代码)
@变量例如:@User.Name,变量或属性结束后,任何形式文本或者标签都自动被解析为html,如遇结束判断有歧义,请加括号如下
@( 表达式 ) 例如:@(i + 1) 或 @(User.Name) 括号里面为:表达式,或者变量
@方法调用 例如:@Html.TextBox("UserName").ToString() 2.代码块
第一种情况:
@{ 代码块 }
@if (条件) { 代码块 }
@switch (条件) { 分支匹配代码块 }
@for (循环控制) { 代码块 }
@foreach (循环控制) { 代码块 }
@while (循环控制) { 代码块 }
@do { 代码块} while (循环控制) 『 代码块里面的代码要严格按照c#语法来,每行结束必需有分号』
第二种情况:(代码块中的文本或者Html客户端标签)
单行文本
@:行内文本 换行的话自动变成了C#服务器端代码。
多行文本
任何标签对 例如:<div>多行文字</div>
任何自闭合标签 例如:<img 多行属性 />
纯文字使用伪标签<text> 例如:<text>多行文字,两侧标签不会被输出</text> 3.其他
电子邮箱可以自动识别,例如:123456@qq.com
被误认为是电子邮箱的请加括号(),例如:123456(@UserName)
要输出商标版权等的,请用@字符转义,例如:@@ →会输出单个字符@
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

HtmlHelper和AjaxHelper

Html.BeginForm的两种写法: 
第一种使用Using语句:

@using(Html.BeginForm())
{ }
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
@using(Html.BeginForm())
{ }
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
第二种使用代码块闭合的形式(注意form是代码块形式
@{Html.BeginForm();}  

@{Html.EndForm();} 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
@{Html.BeginForm();}  

@{Html.EndForm();}  
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

Ajax.BeginForm()的写法只有一种:因为我并没有看到Ajax.EndForm()。呵呵估计是微软的开发团队开发Razor引擎的时候漏掉了

@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId="",OnSuccess=""}))
{ }
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4
@using (Ajax.BeginForm(new AjaxOptions { UpdateTargetId="",OnSuccess=""}))
{ }
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

这里要想Ajax的Form有效的话我们必须在view页面引入

@Scripts.Render("~/bundles/jqueryval")
  • 1
  • 1
@Scripts.Render("~/bundles/jqueryval")  
  • 1
  • 1

这个是微软的脚本捆绑技术,实际上捆绑的就是(以下的JS代码) 

不难看到其中就有ajax的JavaScript脚本 
对于AjaxForm的提交参数的指定: 
当异步请求成功时,会去使用后端返回的内容局部更新UpdateTargetId所指定的客户端的html标签内容,然后调用OnSuccess指定的客户端的JS方法。 
具体参数说明可以参照MSDN: 
OnSuccess:http://msdn.microsoft.com/zh-cn/library/system.web.mvc.ajax.ajaxoptions.onsuccess(v=vs.108).aspx 
对于Razor智能感知的一点补充 
在微软的cshtml页面,@后面跟一些对象的时候会自动出现智能感知 
 
当我们自定义一个类,让后想让这个类在Razor引擎有只能感知能力的时候。我们可以找到 
Views/Web.config文件,打开文件我们会发现如下的节点:

  <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
<namespaces>
<add namespace="System.Web.Mvc" />
<add namespace="System.Web.Mvc.Ajax" />
<add namespace="System.Web.Mvc.Html" />
<add namespace="System.Web.Optimization"/>
<add namespace="System.Web.Routing" />
</namespaces>
</pages>
</system.web.webPages.razor>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

我们只要把我们的类所在的命名空间添加进去就可以了。

最后部分转自:http://blog.csdn.net/hcf_force/article/details/18698751

[转]MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction的更多相关文章

  1. MVC Razor模板引擎 @RenderBody、@RenderPage、@RenderSection及Html.RenderPartial、Html.RenderAction

    一.Views文件夹 -> Shared文件夹下的 _Layout.cshtml 母版页 @RenderBody 当创建基于_Layout.cshtml布局页面的视图时,视图的内容会和布局页面合 ...

  2. MVC Razor模板引擎输出HTML或者生产HTML文件

    以前做CMS的时候都会根据模板来生成输出HTML或者生成HTML文件. 常用的引擎有VTemplate.NVelocity等等,这个我就布做介绍了. 这里我想说的是.当mvc出现Razor模板引擎的时 ...

  3. Asp.net MVC Razor模板引擎技巧分享

    Razor是Asp.net MVC中新的默认模板类型, 语法简单易用.这篇文章不涉及Razor的语法,主要介绍Razor的一些在MVC项目中的使用技巧,以及脱离MVC环境下,如何使用Razor. 阅读 ...

  4. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2 视图模板页

    https://www.cnblogs.com/xlhblogs/archive/2013/06/09/3129449.html MVC Razor模板引擎 @RenderBody.@RenderPa ...

  5. MVC小系列(二)【Razor 模板引擎】

    Razor 模板引擎 Razor模板页:它使我们不用再使用master模板了 一 :@Url.Content:是可以加载CSS和JS等文件比如: <link href="@Url.Co ...

  6. 脱离MVC使用Razor模板引擎

    关于Razor模板引擎 1.简介 模板引擎:Razor.Nveocity.Vtemplate.Razor有VS自动提示.使用起来会方便一点. 但是Razor大多是在MVC下使用的. 那么如何在非MVC ...

  7. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  8. Razor - 模板引擎 / 代码生成 - RazorEngine

    目录 Brief Authors Official Website RazorEngine 的原理 - 官方解释 安装记录 Supported Syntax (默认实现支持的语法) 测试记录 - ca ...

  9. Razor模板引擎

    Razor模板引擎 阅读目录 一.简介 二.非Mvc中使用Razor 三.总结 回到目录 一.简介 在MVC以外的场景中,我们往往需要完成一些模板引擎生成代码或页面的工作:在以前我们一般常用的有Raz ...

随机推荐

  1. WPF圆角按钮

    <ControlTemplate x:Key="CornerButton" TargetType="{x:Type Button}"> <Bo ...

  2. JSOI2008 Blue Mary开公司 | 李超线段树学习笔记

    题目链接:戳我 这相当于是一个李超线段树的模板qwqwq,题解就不多说了. 代码如下: #include<iostream> #include<cstdio> #include ...

  3. 索引+sql优化

    索引的概念: 索引是提高查询速度的一种手段.索引有很多种,以下是索引树的结构 要求查询出薪资大于5000的雇员信息,只要在树中找到5000的节点,直接查询该节点右边的数据即可,左边就不用管了,这样提高 ...

  4. 比较有用的php代码片段

    一 从网页中提取关键词 $meta = get_meta_tags('http://www.emoticode.net/'); $keywords = $meta['keywords']; // Sp ...

  5. django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)

    OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...

  6. [Objective-C语言教程]类别(28)

    有时,可能会发现希望通过添加仅在某些情况下有用的行为来扩展现有类. 要向现有类添加此类扩展,Objective-C提供了类别和扩展. 如果需要向现有类添加方法,或许为了添加功能以便在应用程序中更容易地 ...

  7. 【vim】正常模式下的一般操作

    正常模式一般用于浏览文本,其实也就是通过键盘命令让光标在文本中跳来跳去,在任何模式下按一次或两次<Esc>会进入正常模式. 基本思想 vim对光标的定位操作非常精确和高效,这是它的一个非常 ...

  8. 定期删除Azure存储账号下N天之前的数据文件-ASM

    ######RemoveStorageBlob*DaysOld##### <# .SYNOPSIS Remove all blob contents from one storage accou ...

  9. iOS学习笔记(6)——翻译苹果文档About Windows and Views

    About Windows and Views 关于窗口和视图 In iOS, you use windows and views to present your application’s cont ...

  10. python3的嵌套函数

    背景 最近在学python3 嵌套函数 顾名思义,即使在函数中还有函数,实现了函数的多级嵌套 def test1(): age = 10 print(age) def test2(): te = 5 ...