一、公共模板

转自:http://www.cnblogs.com/kissdodog/archive/2013/01/07/2848881.html 

 1、@RenderBody()

  在网站公用部分通过一个占位符@RenderBody()来为网站独立部分预留一个位置。然后私有页面顶部通过@{Layout="公用模板路 径"}来引入公用模板,并在自身放到公用模板的位置。同时也可以设置ViewData或ViewBag设置网站标题,关键词等信息。

@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "从这里可以设置网站标题";
}
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head> <body>
<div>下面是页面私有部分</div>
@RenderBody()
</body>
</html>

  这样引入了公用的页面其它部分,同时还设置了标题。

二、section-节

  节:@section

   通过在页面中加入节可以设置多个公用模板部分,

  @RenderSection("Footer")  定义一个节,当视图不提供这个节的代码时会报错:节未定义:“xxxxxx”。

  @RenderSection("Footer",false)  重载,如果设置了第二个参数为false,则说明这个节不是必须的,当视图不提供这个节的代码时也不会报错。  

  下面演示一个页脚节,下面是公用页面模板

<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head> <body>
<div>下面是页面私有部分</div>
@RenderBody()
@*<footer>@RenderSection("Footer")</footer>*@  //如果第二个参数不设置,那么如果当视图没有设置节的时候,则会提示错误。
<footer>@RenderSection("Footer",false)</footer> //如果设置了第二个参数为flase,那么视图可以设置节也可以不设置节都没问题。
</body>
</html>

  //这个是视图

@{
Layout = "~/Views/Shared/_Layout.cshtml";
ViewBag.Title = "设置顶部标题";
}
你在他乡还好吗?
@section Footer{
这是页脚节
}

  这是整个页面会包含公用模板,主体和页脚节。

   当页面多个页面都使用到了同一个布局时,每个页面都要通过Layout属性来指定它的布局,会造成冗余,_ViewStart.cshtml可以用来消除 这种冗余,在Views目录下又一个_ViewStart.cshtml文件,这个文件优先于同目录下任何视图的执行,可以用它来指定一个默认布局。

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

  这样所有的视图都会将此布局作为默认布局,如果有视图不想要此布局,可以在视图中重写Layout属性。如果不想要布局,则设置Layout=""即可。

三、分部视图

  分部视图顾名思义是一个视图的一部分,它允许程序员将视图中的一部分独立出来,在某些需要的页面引用。能够减少代码重复,提高页面代码重用性。

  例如:下面这个是返回一个分部视图的Action

        public ActionResult GetName()
{
return PartialView();
}

  在其它任意视图中,只要写如下代码:

    @Html.Partial("GetName")
    //或者可以写成这样
    @{
      Html.RenderPartial("GetName");
     }

  就能够在页面中加载GetName视图的完整代码了。一般来说,分部视图当中不应该包括js,或css因为这样,等于在大视图中到处都是分部视 图的JS与CSS了,一个好的做法是私有JS与CSS通过一个节来引入,这样比较好。都是最好也不要 有<head></head>里面的内容,以及<body></body>标签。因为如果有了这些,还 不如搞成布局呢。分部视图这个东西最有用的地方在于能够把页面中共同的部分提取出来,在用的时候简单引入就行,而实际上,分部视图除了不能指定布局之外, 几乎跟普通视图一样,很爽的一个东西。引用视图可以通过:

    @Html.Partial("分部视图名称")    //有或者下面三行
    @{
      Html.RenderPartial("分部视图名称");
     }

另外分部视图中要注意@Html.Partial()中的重载,这些重载常常有用,如果实在欠缺,就自己写扩展方法来实现。来看看这些重载方法的方法签名。

        public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName);
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model);
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, ViewDataDictionary viewData);
public static MvcHtmlString Partial(this HtmlHelper htmlHelper, string partialViewName, object model, ViewDataDictionary viewData);

  由方法签名中可以看出来,这些都是扩展方法,@Html.Partial是可以将数据实体和数据字典给分部视图的,然后分部视图那边可以通过主视图传过去的数据再生成视图。

给个例子:传递一个Model过去分部视图,然后分部视图那边根据传入的数据再解释视图。来看Controller代码

namespace MvcStart.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
Man_Model man = new Man_Model();
man.Id = 1;
man.Name = "张飞";
man.Age = 23;
return View(man);
} public ActionResult getName(object o)
{
Man_Model man = o as Man_Model;
return PartialView(man);
}
} public class Man_Model
{
public int Id { get; set; }
public string Name { get; set; }
    public int Age { get; set; }
}
}

视图代码:Index.cshtml

@model MvcStart.Controllers.Man_Model
@Model.Id
@Model.Age @Html.Partial("getId",Model);

getName.cshtml

@model MvcStart.Controllers.Man_Model
<div style="">>@Model.Name</div>

生成的HTML代码为:

<html>
<head>
<title>Index</title>
</head> <body>
1 23
<div style="">>张飞</div>
</body>
</html>

  例子写的有点牵强,看不出有什么作用,但是真的是通过主视图传递一个man_Model到分部视图,再由分部视图解析返回的Html代码,这个 东西能够实现什么呢?举个简单的例子,如果分部视图里面的代码是由SEO人员操作的话,例如网页标题,关键词,描述,这个东西值提供了一个框在后台让 SEO人员设置,而设置的结果就是保存到分部视图的代码里面的话?那么只需要给传入一个Model到分部视图,分部视图的标签如Model.Name就能 够自动解析出真正的"张飞"数据。

  2013-5-5,可能之前的理解有些错误,是可以传递Model到分部视图这点不假,但是如果一个视图加载了一个分部视图,那么这个分部视图所得到的数据会和原来页面中的数据一模一样。

  举个例子说明

  Controller代码:

namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
Person p = new Person();
p.Id = 1;
p.Name = "张三";
ViewData["abc"] = "测试ViewData";
return View(p);
} public ActionResult IndexPartial()
{
return View();
}
} public class Person
{
public int Id { get; set; }
    public string Name { get; set; }
}
}

  主视图代码:

@model MvcApplication1.Controllers.Person

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} @Model.Id
@Model.Name
@ViewData["abc"] = "123"
@Html.Partial("IndexPartial");

  分部视图代码:

@model MvcApplication1.Controllers.Person

@{
ViewBag.Title = "IndexPartial";
Layout = "~/Views/Shared/_Layout.cshtml";
} <br/>
分部视图的内容
@Model.Name
@Model.Id
@ViewData["abc"]
分部视图的内容
<br/>

  留意到以上主视图并未传递任何数据给分部视图,但是执行结果如下,你可以看到分部视图的确可以获得主视图中的数据:

  

  再来记录一个技巧,例如一个网站在调试的时候用的是一个测试路径,上传之后用的是真正的域名,这个时候我们可以将域名写在配置文件或XML文件
里,运行是读取,这时候我们可以定义一个静态属性,该属性返回真正的域名。在所有的视图中都可以@命名空间.类.静态变量
获得真正的域名。也就是说,在视图中一些小的可变化片段都可以这样来获取。

  另外,特别需要注意Html.RenderAction()之类的方法还支持传入参数,具体方式如下:

@Html.RenderAction("Left_Nav", "Nav", new{ ParentId = 3 });

  跨区域调用的方式:

@{ Html.RenderAction("Datagrid", "DataList", new { area = "Common" });    }

  在Action里面直接加个参数ActionResult(int ParentId)就能够取得参数值。area会被MVC所截取,分析为跨区域调用。

  区别:

  Partial 分部视图

  另外还有Html.RenderPartial和Html.RenderAction,都是用于在模板页中显示一个功能相对独立的块。

  Partial与RenderPartial的相同点

    两者都用于获取一个分部视图。

  Partial与RenderPartial的区别

  1. Partial有返回值(MvcHtmlString);RenderPartial没有返回值(Void)。

    有返回值可以@Html.Partial()

    而没有返回值就直接@{ Html.Partial(); }

    Partial返回字符串,因此你可以用一个变量来接收返回的Html字符串。但是RenderPartial是将结果写入到Response中,因此没有办法用变量来接收。

    以上两种写法等价。

  Action与RenderAction的区别

  都用于引入一个Action的代码,其区别与上面Partial和RenderPartial的区别相同

  两者的相同点

  RenderPartial和RenderAction通常都被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条。 两者输出的结果都被作为调用的View的一部分显示。

  两者的不同点

  1. RenderPatial的数据来自于调用的View,而RenderAction来自自己。
  2. RenderAction会发起一个新的Request,而RenderPatial不会。
  3. RenderPartial方法是return PartialView();而RenderAction是return View()。

Asp.net MVC 视图之公用代码的更多相关文章

  1. ASP.NET MVC 视图(五)

    ASP.NET MVC 视图(五) 前言 上篇讲解了视图中的分段概念.和分部视图的使用,本篇将会对Razor的基础语法简洁的说明一下,前面的很多篇幅中都有涉及到视图的调用,其中用了很多视图辅助器,也就 ...

  2. ASP.NET MVC 视图(四)

    ASP.NET MVC 视图(四) 前言 上篇对于利用IoC框架对视图的实现进行依赖注入,最后还简单的介绍一下自定义的视图辅助器是怎么定义和使用的,对于Razor语法的细节和辅助器的使用下篇会说讲到, ...

  3. ASP.NET MVC 视图(三)

    ASP.NET MVC 视图(三) 前言 上篇对于Razor视图引擎和视图的类型做了大概的讲解,想必大家对视图的本身也有所了解,本篇将利用IoC框架对视图的实现进行依赖注入,在此过程过会让大家更了解的 ...

  4. ASP.NET MVC 视图(二)

    ASP.NET MVC 视图(二) 前言 上篇中对于视图引擎只是做了简单的演示,对于真正的理解视图引擎的工作过程可能还有点模糊,本篇将会对由MVC框架提供给我们的Razor视图引擎的整个执行过程做一个 ...

  5. ASP.NET MVC 视图(一)

    ASP.NET MVC 视图(一) 前言 从本篇开始就进入到了MVC中的视图部分,在前面的一些篇幅中或多或少的对视图和视图中的一些对象的运用进行了描述,不过毕竟不是视图篇幅说的不全面,本篇首先为大家讲 ...

  6. Asp.net MVC 视图引擎

    Asp.net MVC视图引擎有两种: 1.ASPX View Engine 这个做过WebForm的人都清楚 设计目标:一个用于呈现Web Form页面的输出的视图引擎. 2.Razor View ...

  7. 【ASP.NET MVC系列】浅谈ASP.NET MVC 视图

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  8. (转)Asp.Net Mvc视图引擎Razor介绍

    Asp.Net Mvc视图引擎Razor介绍 1.Razor介绍 程序园原创,转载请注明:http://www.kwstu.com/ArticleView/dabaomvc_2014082408205 ...

  9. 为ASP.NET MVC视图输出json

    做个小小练习,为asp.net mvc视图输出json字符串: 创建JsonResult操作: 创建此视图: 浏览结果:

随机推荐

  1. Java_Web学习路线

  2. Asp.net网页中禁止使用剪切、复制、粘贴的方法

    工欲善其事,必先利其器 在asp.net开发的网页中,有时候需要禁止用户粘贴复制密码,禁止用户copy文章直接粘贴到文本框中.采取的方法是直接在限制控件的地方写上禁止粘贴文本的代码.但是这样不是很方便 ...

  3. ajaxError

    $(document).ready(function () { $('input:button').click(function() { if($('#fileName').val() == '') ...

  4. Eclipse Memory Analysis进行堆转储文件分析

    生成堆转储文件 新建项目,设置Eclispe Java堆的大小: (1)限制Java堆大小:将最小值 -Xms参数与最大值-Xmx参数设置一样可避免堆的扩展         -Xmx20m -Xms2 ...

  5. TCP传输小数据包效率问题(译自MSDN)

    TCP传输小数据包效率问题(译自MSDN) http://www.ftpff.com/blog/?q=node/16 摘要:当使用TCP传输小型数据包时,程序的设计是相当重要的.如果在设计方案中不对T ...

  6. W3C盒子与IE盒子模型

    盒模型: 内容(content).填充(padding).边界(margin). 边框(border) IE的content部分把 border 和 padding计算了进去 例:一个盒子的 marg ...

  7. SQL技术内幕二DDL

    创建数据库: if db_id('DBTest') is nullcreate database DBTest 创建表 use eb_fy_data_test---use 切换所在数据库上下文 if ...

  8. PHP学习心得(八)——运算符

    运算符是可以通过给出的一或多个值(用编程行话来说,表达式)来产生另一个值(因而整个结构成为一个表达式)的东西.所以可以认为函数或任何会返回一个值(例如 print)的结构是运算符,而那些没有返回值的( ...

  9. PHPFarm - How to run multiple versions of PHP on the same computer

    How to Run Multiple Versions of PHP on One Server 转载:http://www.sitepoint.com/run-multiple-versions- ...

  10. SQL注入原理二

    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多. 但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候 ,没有对用户输入数据的合法性进行判断,使应用程序存 ...