開發人員常常但願應用程序能夠在多個不一樣的地方使用一樣的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")。code
二、Html.Partial用於將分部視圖渲染爲字符串,{Html.RenderPartial}將分佈視圖直接寫入響應輸出流,因此只能直接放在代碼塊中,不能放在表達式中(返回值是void)。RenderPartial由於是直接寫在響應流中,因此性能會更好(微量影響),而Partial不用寫在代碼塊中,因此更方便。htm
三、Partial、RenderPartial在執行時都只是把一個個的View嵌入到調用界面中,其中不涉及到控制器的操做。不須要通過控制器View()來進行視圖的渲染操做。對象
子動做是經過視圖來調用的動做方法。若是但願將某種控制器邏輯在應用程序的多處進行復用時,能夠經過子動做來解決。
咱們在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不會。
最後給出一張圖來直觀的比較二者的不一樣吧