2011-12-16 49 views
1

这是MVC 2传递ViewData的MVC的用户控件

这是我的用户控制

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”?有一些更好的方法可以将一些简单的数据传递给这个部分吗?

在模型中传递它将而不是工作,因为我已经使用模型的东西。

编辑

手动分配此值TempData的确实工作。我应该只使用TempData吗? ViewData只能从Controller中设置吗?

回答

1

ViewData根据微软的文档,它:

获取或设置包含数据的 控制器和视图之间传递的字典。

所以,从这个定义中,我会说你说得对,只能从控制器设置ViewData。如果TempData适合你,我会使用它。如果你不怕动态,你也可以尝试ViewBag。

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

+0

我应该看过那些文档。谢谢。如果我们升级到MVC3,我会遍布ViewBag。再次感谢 – 2011-12-16 18:29:22

1

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

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

我已经做了一次或两次,但我会说你真的应该考虑在模型中传递它。如果你的模型还不是视图模型,那么我会建议制作一个有两个属性的模型:一个代表目前是“Model”的任何一个,另一个代表“Foo”。控制器会设置它并将其传递给视图。

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

让您的视图使用此视图模型。然后,当你渲染你的部分你可以通过整个模型,或者只是给它美孚(如果你的局部视图只需要一个字符串):

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

是你的选择,但创建一个视图模型容器包含视图所需的所有内容,任何部分视图都是我的首选方法。

+0

我通常会倾向于编写一个强大的ViewModel,它具有View所需的所有功能,但这是一个遗留系统(毕竟是MVC 2),我认为TempData是正确的路径。 +1虽然,谢谢 – 2011-12-16 18:28:11