将ViewData传递给部分视图

时间:2014-02-20 08:19:31

标签: c# asp.net-mvc asp.net-mvc-3 renderpartial viewdata

控制器

 IEnumerable<AvgPosGAFields> _myList = helper.ConvertToListAvgPosGa(locDataSetGACampaigns.Tables[0]);        
 ViewData["hourlydata"] = _myList;

我想使用将此ViewData传递给我的部分填充表格我使用renderpartial来渲染我的部分我的。 我怎样才能传递这个ViewData?我怎么能用foreach呢?

主要观点:

 Html.RenderPartial( "HourlyDetails",new ViewDataDictionary { { "hourlydata", 0 } } );

部分视图包含一个表,该表将由ViewData中的模型填充

4 个答案:

答案 0 :(得分:2)

作为替代方案,我建议切换ViewData以使用View Models,因为它们是强类型的。

您可以通过以下方式执行此操作:

创建视图模型

public class AViewModel
{
  public IEnumerable<AvgPosGAFields> HourlyData { get; set; }
}

<强>控制器

var model = new AViewModel();
model.HourlyData = helper.ConvertToListAvgPosGa(locDataSetGACampaigns.Tables[0]);

return View(model);

以上假设您的方法返回IEnumerable<AvgPosGAFields>

查看

在顶部添加模型参考,然后将模型传递到部分,如下所示:

@model AViewModel
...
@Html.Partial("HourlyDetails", Model.HourlyData)

部分视图

还将模型引用添加到局部视图的顶部,即

@model IEnumerable<AvgPosGAFields>

这意味着您可以在部分中循环模型,如下所示:

@foreach(var avgPosGAField in Model)
{
      @avgPosGAField.FooProperty
}

答案 1 :(得分:0)

您可以在控制器中使用Html.Action()

public ActionResult RenderAction()
{
   //....
   IEnumerable<AvgPosGAFields> _myList = helper.ConvertToListAvgPosGa(locDataSetGACampaigns.Tables[0]);        

   return PartialView( _myList );
}

并从您想要的其他视图中调用它:

@Html.Action("RenderAction", "Controller")

RenderAction视图中,使用foreach循环。

答案 2 :(得分:0)

检查你是否意外或部分故意覆盖完整的ViewData,我的问题是覆盖ViewData进行模板化,而没有意识到ViewData的其余部分已经消失。

@Html.Partial("_EmployeeFormContent", @Model.Employee, new ViewDataDictionary() { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = nameof(Model.Employee) } })

将当前ViewData添加到新ViewDataDictionary修复了它:

    @Html.Partial("_EmployeeFormContent", @Model.Employee, new ViewDataDictionary(ViewData) { TemplateInfo = new TemplateInfo { HtmlFieldPrefix = nameof(Model.Employee) } })

答案 3 :(得分:0)

使用viewbag代替viewdata

IEnumerable<AvgPosGAFields> _myList = helper.ConvertToListAvgPosGa(locDataSetGACampaigns.Tables[0]);
ViewData["hourlydata"] = _myList;

所以试试

ViewBag.hourlydata = _myList;

然后即使它不起作用,试试这个解决方案
http://www.codenoevil.com/pass-additional-viewdata-asp-net-mvc-4/