开发人员常常但愿应用程序能够在多个不一样的地方使用一样的Razor标签和HTML标记代码。这并不须要咱们在多个地方重复这些标签,使用MVC中的分部视图和子动做可让咱们很好的解决相似的状况。html
使用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经过传递参数将数据传递到分部视图。如上图。这时候我吗刷新浏览器就能够看到从主界面传递到分部视图的参数了。性能
注意点:spa
一、Partial("MyPartialView")调用时,Razor引擎会在常规位置进行分部视图的查找。先查找Views/Controller中查找,若是找不到到Views/Shared文件夹下进行查找。固然分部视图也能够在这些常规位置之外的地方定义。例如:在Views/Menus/文件夹下定义MyPartialView.cshtml。主界面在调用时须要指定完整的路径。如:Partial("~/Views/Menus/MyPartialView.cshtml")。3d
二、Html.Partial用于将分部视图渲染为字符串,{Html.RenderPartial}将分布视图直接写入响应输出流,因此只能直接放在代码块中,不能放在表达式中(返回值是void)。RenderPartial由于是直接写在响应流中,因此性能会更好(微量影响),而Partial不用写在代码块中,因此更方便。code
三、Partial、RenderPartial在执行时都只是把一个个的View嵌入到调用界面中,其中不涉及到控制器的操做。不须要通过控制器View()来进行视图的渲染操做。htm
子动做是经过视图来调用的动做方法。若是但愿将某种控制器逻辑在应用程序的多处进行复用时,能够经过子动做来解决。
咱们在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(2); return PartialView(time); }
调用界面在调用时能够经过匿名对象来传递参数。如: @{Html.RenderAction("MyChildAction", new { time = DateTime.Now });}
注意点:
一、子动做是经过控制器来执行动做方法。处理ViewResult,而后注入到发送给客户端的响应流中。这个方法相对于Partial比较灵活,它能够利用控制器的上下文。
二、ChildActionOnly注释能够肯定一个视图方法只能在视图中做为子动做进行调用。防止该子动做做为一个用户请求的结果被调用。
相同点:
通常都被用来显示一个功能相对独立的“块”,好比说显示菜单或者导航条。 二者输出的结果都被做为调用的View的一部分显示
不一样点:
RenderPatial的数据来自于调用的View,而RenderAction来自本身。
RenderAction会发起一个新的Request,而RenderPatial不会。
最后给出一张图来直观的比较二者的不一样吧