HTML.Action()和HTML.RenderAction()類似於HTML.Partial()和HTML.RenderPartial()輔助方法。Partial輔助方法通常在單獨的文件中應用視圖標記來幫助視圖渲染視圖模型的一部分。另一方面,Action是執行單獨的控制器操作並顯示結果。Action提供了更多的靈活性和重用性,因爲控制器操作可以建立不同的模型,可以利用單獨的控制器上下文。
示例目的,生成一個菜單
Menu Models,
public class Menu
{
public List<MenuItem> Items { get; set; }
}
public class MenuItem
{
public string Text { get; set; }
public string Url { get; set; }
}
在Controler中編寫該Action,
[ChildActionOnly]
public ActionResult MyMenu()
{
MvcLearn.Models.Menu m = new MvcLearn.Models.Menu();
List<MvcLearn.Models.MenuItem> items = new List<MenuItem>();
items.Add( new MenuItem(){ Text = "Baidu", Url = "http://www.baidu.com"});
items.Add(new MenuItem() { Text = "Sina", Url = "http://www.Sina.com" });
items.Add(new MenuItem() { Text = "IBM", Url = "http://www.ibm.com" });
items.Add(new MenuItem() { Text = "Sohu", Url = "http://www.sohu.com" });
m.Items = items;
return PartialView(m);
}
建立一個PartialView - MyMenu.cshtml
@model MvcLearn.Models.Menu
<ul>
@foreach(var item in Model.Items)
{
<li><a href="@item.Url">@item.Text</a></li>
}
</ul>
在頁面中調用該Action生成視圖:
@Html.Action("MyMenu")
Action和PartialView的名字要一樣,這裏都是MyMenu
以下是向Action傳遞參數的版本:
修改Action讓它可以接受一個MenuItem參數,如果不爲空的話,將其加入到菜單中
[ChildActionOnly]
public ActionResult MyMenu(MenuItem mi)
{
MvcLearn.Models.Menu m = new MvcLearn.Models.Menu();
List<MvcLearn.Models.MenuItem> items = new List<MenuItem>();
items.Add( new MenuItem(){ Text = "Baidu", Url = "http://www.baidu.com"});
items.Add(new MenuItem() { Text = "Sina", Url = "http://www.Sina.com" });
items.Add(new MenuItem() { Text = "IBM", Url = "http://www.ibm.com" });
items.Add(new MenuItem() { Text = "Sohu", Url = "http://www.sohu.com" });
m.Items = items;
// 這裏,如果傳入的參數不爲空,則將Item加入到菜單中
if(mi!=null)
m.Items.Add(mi);
return PartialView(m);
}
在前臺調用的時候要傳入參數進去:
@Html.Action("MyMenu", new { mi= new MvcLearn.Models.MenuItem(){ Text = "haha", Url =http://www.ms.com}})
這裏的參數mi 必須要跟在action中定義的形式參數mi名稱保持一致,否則值可能無法成功傳遞!!!