【问题标题】:Set ViewData inside a RenderPartial在 RenderPartial 中设置 ViewData
【发布时间】:2015-03-04 14:52:19
【问题描述】:

我之前一直使用 TempData 来设置诸如“body css 类”之类的东西,然后页面和部分可以覆盖。

在意识到 TempData 使用会话之后,我现在已经转移到 ViewData,但是在部分中设置 ViewDataDictionary 的值在返回到页面时基本上会被忽略 - 并且永远不会向上传播布局层次结构。

我尝试从我的页面内部调用“RenderPartial”,并使用允许我指定要传递的 ViewData 的覆盖:

布局:

页面:

@{
    var cssClass = (ViewData["something"] != null) ? ViewData["something"].ToString() : "";
}

<body class="@cssClass">

页面:

@{
    ViewData["something"] = "blah";
    Html.RenderPartial("MyPartial", ViewData)
}

部分:

@{
    ViewData["something"] += " blah";
}

当我在 Layout 中进行调试时,我可以看到 ViewData["something"] 是“blah” - 部分设置不正确。

当我使用 TempData 时,这可以正常工作。由于 ASP 会话锁定及其对并发请求的影响,我真的不想重新使用 TempData。

以前有人做过这个吗?我忽略了什么吗?

谢谢

【问题讨论】:

  • 如果您遇到的问题与局部视图未正确呈现有关,read this。否则,我们可能需要有关您所面临问题的更多具体信息。此外,您不应该使用 ViewData 或 TempData 来保留查看特定信息。您应该使用视图模型。
  • 一切正常。我在视图内部使用它,由视图显示。例如为特定页面设置特定的 CSS 类。问题是 ViewData 正在设置我的部分不传播
  • 你仍然可以使用 HttpContext.Current.Items["something"]

标签: asp.net-mvc razor


【解决方案1】:

所以这是一种单向传播,正如您发现的那样,如果您想设置部分数据并返回父视图,您可以使用HttpContext,这不是很酷,但它可以工作:

家长:

@{
    HttpContext.Current.Items["Something"] = "blah";
    Html.RenderPartial("_Partial");
}
@HttpContext.Current.Items["Something"];

部分:

@{
    HttpContext.Current.Items["Something"] = "somethingelse";
}

在父级中输出“somethingelse”。

另外,如果您绕过 TempData,它通常的完成方式是通过父模型或临时模型:

型号:

public class MyTempModel
{
    public string Something { get; set; }
}

家长:

@{
    var tmod = new MyTemModel()
    {
       Something = "blah"
    };
    Html.RenderPartial("_Partial", tmod);
}
@tmod.Something;

部分:

@model MyTempModel
@{
    tMod.Something = "somethingelse";
}

在父级中输出“somethingelse”。

【讨论】:

  • Brilliant - 非常感谢使用 HttpContext.Items 的戳 - 我们目前将其用于“按请求”缓存,但我没想过用它来解决这个问题!这很有魅力 - 干杯。
【解决方案2】:

每个视图都有自己的ViewData。默认情况下,Razor 使用父级的ViewData 填充层次结构的更下方的视图,但这是单向的。例如,如果您执行以下操作:

SomeView.cshmtl

@{ ViewData["foo"] = "bar"; }
@Html.Partial("_SomePartial")

SomePartial.cshtml

@ViewData["foo"]

部分的结果将是您所期望的“bar”。但是,如果你做了类似的事情:

SomeView.cshtml

@Html.Partial("_SomePartial")
@ViewData["foo"]

_SomePartial.cshtml

@{ ViewData["foo"] = "bar"; }

不会打印任何内容,因为 ViewData["foo"] 不存在于父视图的视图数据中,仅存在于部分视图数据中。

【讨论】:

  • 我担心这是一种单向传播,谢谢你的澄清,克里斯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多