这是 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设置吗?
答案 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和任何部分视图所需的所有内容,这是我的首选方法。