1、引言

  开发人员经常希望应用程序可以在多个不同的地方使用同样的Razor标签和HTML标记代码。这并不需要我们在多个地方重复这些标签,使用MVC中的分部视图和子动作可以让我们很好的解决类似的情况。

2、Partial、RenderPartial的使用

  使用MVC中的Html.RenderPartial、Html.RenderAction都可以在主界面中嵌入分部视图,下面就来介绍这两种技术。

  我们创建一个视图文件MyPartialView.cshtml。保存在Views/Home/文件夹下。与主界面放在一个文件夹下。其HTML标签:

@model List<string>
<div>
<hr />
<p>我是分部视图MyPartialView.cshtml</p>
@*<p>传递的数据如下:</p>*@
<ul>
@if(Model!=null){
foreach(var item in Model)
{
<li>@item</li>
}
}
</ul>
@*<p>传递的字符串是:</p>
@ViewData["Para"]*@
<hr />
</div>

  主界面Views/Home/Index.cshtml的HTML标签如下:

@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>
当前页面是:Home/Index.cshtml,调用分部视图MyPartialView.cshtml
<br />
@{
ViewData["Parameter"]="Values";
var data = new ViewDataDictionary();
data.Add("Para", ViewData["Parameter"]);
}
@*@Html.Partial("MyPartialView",new List<string>{"str1","str2","str3"},data)*@
@Html.Partial("MyPartialView")
</h2>

  在浏览器运行后可以看到有如下的效果:

  可以看到我的代码中有一些注释。Html.Partial通过传递参数将数据传递到分部视图。如上图。这时候我吗刷新浏览器就可以看到从主界面传递到分部视图的参数了。

注意点:

  1、Partial("MyPartialView")调用时,Razor引擎会在常规位置进行分部视图的查找。先查找Views/Controller中查找,如果找不到到Views/Shared文件夹下进行查找。当然分部视图也可以在这些常规位置以外的地方定义。例如:在Views/Menus/文件夹下定义MyPartialView.cshtml。主界面在调用时需要指定完整的路径。如:Partial("~/Views/Menus/MyPartialView.cshtml")。

  2、Html.Partial用于将分部视图渲染为字符串,{Html.RenderPartial}将分布视图直接写入响应输出流,所以只能直接放在代码块中,不能放在表达式中(返回值是void)。RenderPartial因为是直接写在响应流中,所以性能会更好(微量影响),而Partial不用写在代码块中,所以更方便。

  3、Partial、RenderPartial在执行时都只是把一个个的View嵌入到调用界面中,其中不涉及到控制器的操作。不需要经过控制器View()来进行视图的渲染操作。

3、Action、RenderAction的使用(子动作)

  子动作是通过视图来调用的动作方法。如果希望将某种控制器逻辑在应用程序的多处进行复用时,可以通过子动作来解决。

  我们在Views/Home/文件夹下新建一个MyChildAction.cshtml视图文件。其HTML标签及代码如下:

@model DateTime
@{
ViewBag.Title = "MyChildAction";
}
<h2>子动作界面</h2>
<p>当前服务器时间是:</p>
<p>@Model.ToShortDateString()</p>

  我们现在来看HomeController中对于子动作的方法。代码如下:

public class HomeController : Controller
{
public ActionResult Index()
{
return View();
} /**
* 只能被子动作调用
* */
[ChildActionOnly]
public ActionResult MyChildAction()
{
return PartialView(DateTime.Now);
}
}

  我们看到HomeController中这个子动作只是简单的返回一个服务端的当前时间。然后对MyChildAction视图文件进行渲染。通过在主界面调用@{Html.RenderAction("MyChildAction");}。在使用分部视图时推荐使用PartialView()。因为View()返回会让框架认为这是一个标准视图,会自动加上Layout布局文件。使用PartialView不会自动加上布局文件。

  我们看到Html.RenderAction("MyChildAction")会导致MVC框架在处理当前请求的控制器中(例子中是:HomeController)查找一个动作方法。如果在其他控制器中定义了一个子动作。可以指定控制器的名称。

例如:Html.RenderAction("MyChildAction","MySimple")。这样MVC框架就会在MySimpleController控制器中查找MyChildAction方法进行执行。

  在子动作中,可以在调用的时候进行参数的传递。如下所示:

[ChildActionOnly]
public ActionResult MyChildAction(DateTime time)
{
time = time.AddYears();
return PartialView(time);
}

  调用界面在调用时可以通过匿名对象来传递参数。如: @{Html.RenderAction("MyChildAction", new { time = DateTime.Now });}

注意点:

  1、子动作是通过控制器来执行动作方法。处理ViewResult,然后注入到发送给客户端的响应流中。这个方法相对于Partial比较灵活,它可以利用控制器的上下文。

  2、ChildActionOnly注释可以确定一个视图方法只能在视图中作为子动作进行调用。防止该子动作作为一个用户请求的结果被调用。

4、Partial、Action两者的异同点

  相同点:

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

  不同点:

    RenderPatial的数据来自于调用的View,而RenderAction来自自己。

    RenderAction会发起一个新的Request,而RenderPatial不会。

最后给出一张图来直观的比较两者的不同吧

Html.RenderPartial、Html.RenderAction联系与区别的更多相关文章

  1. asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别

    转载自 :  <asp.net mvc @Html.Partial @Html.Action @Html.RenderPartial @Html.RenderAction区别> 先复制过来 ...

  2. MVC中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别

    Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. 1. Html.RenderPartial是直接将用户控件嵌入到界面上: <% ...

  3. Partial RenderPartial Action RenderAction 区别和用法

    区别: 1.Partial 与 RenderPartial 两个方法性质基本一样,只是把一个静态用户控件给嵌入进来. 2.Partial 回传一堆html代码,直接写进到页面上@Html.Partia ...

  4. @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别

    ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 对这四个的区别做一个总结,清理一下思路 ...

  5. @Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction区别 .(转)

    mvc renderaction   renderpartial  杂谈      Html.RenderPartial与Html.RenderAction这两个方法都是用来在界面上嵌入用户控件的. ...

  6. Asp.Net MVC3.0 Partial RenderPartial Action RenderAction 区别和用法

    本人写的博文不多,专业知识不强,以下纯属于个人笔记.如有不对,还请各路大拿,拍砖指导,谢谢! 区别: 1.Partial 与 RenderPartial 两个方法性质基本一样,只是把一个静态用户控件给 ...

  7. MVC 部分视图:Partial() 、RenderPartial() 、 Action() 、RenderAction() 、 RenderPage() 区别

    在视图里有多种方法可以 加载部分视图,包括: Partial()  Action()  RenderPartial()  RenderAction()  RenderPage() 方法. 以下是这些方 ...

  8. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】

    Html.partial和RenderPartial的用法与区别Html.partial和RenderPartial都是输出html片段,区别在于Partial是将视图内容直接生成一个字符串并返回(相 ...

  9. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法(mvc部分视图的添加)

    Partial 和RenderPartial:这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回 ...

  10. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法

    Partial 和RenderPartial:这两个的性质都是一样, 只指把一个个View给镶入进来, 只是回传值有点不一样Partial 回传的一个Object (MvcHtmlString), 回 ...

随机推荐

  1. python 学习笔记7(类/对象的属性;特性,__getattr__)

    27. 属性的__dict__系统 1)对象的属性可能来自: 其类的定义,叫做类属性 继承父类的定义 该对象实例定义(初始化对象时赋值),叫做对象属性 2)对象的属性存储在对象的 __dict__ 属 ...

  2. 75.Android之基本架构

    转载:http://www.cnblogs.com/lijunamneg/archive/2013/01/18/2866953.html Android其本质就是在标准的Linux系统上增加了Java ...

  3. java高新技术-类加载器

    1.类加载器及委托机制的深入分析 > 类加载器的作用:一个java文件中的出现的类,首先要把这个类的字节码加载到内存中,这个类的信息放在硬盘的classPath下的class文件中,  把cla ...

  4. C语言之捕捉信号

    我们有时候需要在程序中做一些对于用户或内核发出的信号后的处理,如写回文件等善后处理的事情,或者直接忽略信号(当你按Ctrl+C时我压根不理你).下面是一段信号处理的代码(POSIX C): int c ...

  5. [NOIP2013] 提高组 洛谷P1969 积木大赛

    题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...

  6. Load Average

    在Linux系统下面,有很多的命令可以查看系统的负载情况:比如top,uptime,w,示例如下: [wenchao.ren@l-cmsweb1.ops.cn1 ~]$ w 18:39:10 up 7 ...

  7. 【转载】MFC键盘响应

    转载自:传送门 一:首先介绍键盘消息 系统消息: ALT,F1,--F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键. WM_SYSKEYDOWN WM_SYSKEYUP WM_SYSC ...

  8. jQuery ajax - serialize() 方法-输出序列化表单值

    定义和用法 serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. 您可以选择一个或多个表单元素(比如 input 及/或 文本框),或者 form 元素本身. 序列化的值可在生 ...

  9. 使用substring方法进行字符串拆分

    对一个字符串进行操作,我们通常会用到这2个类:String类.StringBuffer类 而这2个类中的方法大多都是相同的,今天主要介绍他俩共同的一个特别有用的方法:substring substri ...

  10. primefaces p:dataExporter filename 支持中文 utf8

    p:fileDownload and p:dataExporter : for p:fileDownload, the Content-Disposition header should be set ...