需要将Viewbag和TemplateInfo传递给MVC中的局部视图

时间:2016-01-15 14:32:08

标签: asp.net-mvc asp.net-mvc-4 razor

因此,如何将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前缀传递给。

1 个答案:

答案 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>