【问题标题】:Pass ViewData to MVC user control将 ViewData 传递给 MVC 用户控件
【发布时间】:2012-01-22 04:03:56
【问题描述】:

这是 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"] 显示“条形图”?有没有更好的方法将一些简单的数据传递给这个部分?

在模型中传递它不起作用,因为我已经将模型用于其他用途。

编辑

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

【问题讨论】:

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


    【解决方案1】:

    根据微软在ViewData 上的文档,它:

    获取或设置一个字典,其中包含要在 控制器和视图。

    因此,仅从该定义来看,我想说 ViewData 只能从控制器设置是正确的。如果 TempData 对您有用,我会使用它。如果你不怕动态,你也可以试试 ViewBag。

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

    【讨论】:

    • 我应该看看那些文档。谢谢你。如果我们升级到 MVC3,我会在 ViewBag 上到处都是。再次感谢
    【解决方案2】:

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

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

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

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

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

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

    选择权在你,但我更喜欢创建一个包含 View 和任何 Partial View 所需的一切的视图模型容器。

    【讨论】:

    • 我通常倾向于编写一个强大的 ViewModel,它拥有 View 所需的一切,但这是一个遗留系统(毕竟是 MVC 2),我认为 TempData 是正确的道路。 +1 不过,谢谢
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2010-12-15
    相关资源
    最近更新 更多