[英]Need to pass Viewbag and TemplateInfo to partial view in MVC
因此,如何將Viewbag數據傳遞到部分視圖的問題已在這里得到了多次回答,但是我需要將Viewbag信息和TemplateInfo傳遞到我的部分視圖,而我找不到解決該問題的單個問題。 我的控制器的一部分看起來像這樣。
<div>
@{Html.RenderPartial("AboutActivity", (Transport.Models.Tracking.TravelRequest.AboutActivityModel)Model,
new ViewDataDictionary { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "AboutActivity" } });}
</div>
這樣可以很好地將對象映射回模型以及所有對象,但是我有一些視圖需要從ViewBag數據中加載下拉列表。
@Html.DropDownList("Destination.State", (IEnumerable<SelectListItem>)ViewBag.States)
如何將ViewBag數據和TemplateInfo前綴傳遞給它。
您無需將ViewBag數據從主視圖顯式傳遞到局部視圖。 只要您可以在主視圖中使用它( 這意味着您在GET操作中設置了ViewBag數據 ),它在部分視圖中也將可用。
public ActionResult Index()
{
var states = new List<SelectListItem>
{
new SelectListItem {Value = "MI", Text = "MI"},
new SelectListItem {Value = "OH", Text = "MOH"}
};
ViewBag.States = states;
return view();
}
在索引和從索引視圖中調用的局部視圖中,可以訪問ViewBag.States。
索引檢視
@Html.DropDownList("Destination.State", (IEnumerable<SelectListItem>)ViewBag.States)
<div>
@{ Html.RenderPartial("AboutActivity"); }
</div>
部分視圖(AboutActivity )
<h2>My PartialView</h2>
@Html.DropDownList("Destination.State", (IEnumerable<SelectListItem>)ViewBag.States)
更好的解決方案是不要使用諸如ViewBag和ViewData之類的動態內容在動作方法和視圖之間傳遞數據。 為什么不將新屬性添加到下拉列表數據類型為List<SelectListItem>
視圖模型中並使用它呢?
public class AboutActivityViewModel
{
public List<SelectListItem> States {set;get;}
public int SelectedState {set;get;}
// Other properties for the view as needed
}
public ActionResult Index()
{
var vm = new AboutActivityViewModel();
vm.States = new List<SelectListItem>
{
new SelectListItem {Value = "MI", Text = "MI"},
new SelectListItem {Value = "OH", Text = "MOH"}
};
return view(vm);
}
和您的視圖,它被強類型為AboutActivityViewModel
@model AboutActivityViewModel
<div>
@{ Html.RenderPartial("AboutActivity"); }
</div>
並且在您的Partial視圖中,它也是強類型的。
@model AboutActivityViewModel
@Html.DropDownListFor(f => f.SelectedState, Model.States)
如果沒有將模型顯式傳遞給部分視圖,它將使用從其調用的父頁面的模型。
在您的情況下,您要將一個全新的ViewDataDictionary
傳遞給該部分,它將覆蓋您之前設置給ViewBag的狀態。 因此,您應確保從現有的ViewBag中讀取狀態,並將其設置為要傳遞的新ViewDataDictionary
。
<div>
@{ Html.RenderPartial("AboutActivity", Model, new ViewDataDictionary
{
TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "AboutActivity" },
["States"] = ViewBag.States
});
}
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.