因此,如何将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前缀传递给。
答案 0 :(得分:1)
您无需将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>
在您的部分视图中,它也是强类型的。
@model AboutActivityViewModel
@Html.DropDownListFor(f => f.SelectedState, Model.States)
如果你没有明确地将模型传递给局部视图,它将使用它的父页面模型被调用。
在您的情况下,您将一个全新的ViewDataDictionary
传递给partial,它将覆盖您之前设置为ViewBag的状态。因此,您应该确保从现有的ViewBag中读取状态并将其设置为您要传递的新ViewDataDictionary
。
<div>
@{ Html.RenderPartial("AboutActivity", Model, new ViewDataDictionary
{
TemplateInfo = new TemplateInfo { HtmlFieldPrefix = "AboutActivity" },
["States"] = ViewBag.States
});
}
</div>