将ViewData传递给MVC用户控件

时间:2011-12-16 16:48:45

标签: asp.net-mvc asp.net-mvc-2

这是 MVC 2

这是我的用户控件的一部分

Foo = <%= ViewData["Foo"] %>

<ul id="menu" class="topTabMenu">
    <% foreach (X.Site s in X.AllSites) { %>
    ...

这就是我所说的:

<% Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new { Foo = "Bar" })); %>

我需要做些什么才能让ViewData["Foo"]显示“Bar”?有没有更好的方法将一些简单的数据传递给这个部分?

在模型中传递它将工作,因为我已经将Model用于其他事情。

修改

手动将此值分配给TempData确实有效。我应该只使用TempData吗? ViewData只能从Controller设置吗?

2 个答案:

答案 0 :(得分:1)

根据微软关于ViewData的文档,它:

  

获取或设置一个包含要在其间传递的数据的字典   控制器和视图。

所以,从单独的定义来看,我会说你是正确的,只能从控制器设置ViewData。如果TempData适合你,我会用它。如果你不害怕动态,你也可以试试ViewBag。

编辑:忽略我对ViewBag的评论,我没有看到你的问题被MVC2标记。

答案 1 :(得分:1)

我不确定您是否可以使用匿名对象创建ViewDataDictionary。尝试重载另一个ViewDataDictionary。这应该让你的ViewData [“foo”]显示“Bar”。

Html.RenderPartial("MenuTabsPartial", Model, new ViewDataDictionary(new ViewDataDictionary { { "Foo", "bar" } }));

我已经做了一两次,但我会说你真的应该考虑在模型中传递它。如果您的模型不是 view 模型,那么我建议创建一个具有两个属性的模型:一个表示当前的“模型”,另一个表示“Foo”。 Controller会将其设置并将其传递给视图。

class MyViewModel
{
    public TypeOfMainModel MainModel {get; set;} //put your current model here
    public string Foo {get; set;}
}

让您的视图将其用作视图模型。然后当你渲染你的部分时,你可以传递整个模型,或者只是给它Foo(如果你的局部视图只需要一个字符串):

Html.RenderPartial("MenuTabsPartial", Model.Foo);

选择权属于您,但创建一个视图模型容器,其中包含View和任何部分视图所需的所有内容,这是我的首选方法。