在RenderPartial中设置ViewData

时间:2015-03-03 17:41:50

标签: asp.net-mvc razor

我以前一直使用TempData设置像#34; body css class"这样页面和部分可以覆盖。

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

我试过打电话" RenderPartial"从我的页面内部,并使用覆盖,允许我指定要传递的ViewData:

布局:

页:

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

<body class="@cssClass">

Page:

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

部分:

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

当我在我的布局中调试时,我可以看到ViewData [&#34;某些东西&#34;]是&#34; blah&#34; - 部分没有正确设置。

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

以前有人让这个上班吗?我忽略了什么吗?

由于

2 个答案:

答案 0 :(得分:3)

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

<强> SomeView.cshmtl

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

<强> SomePartial.cshtml

@ViewData["foo"]

部分的结果将是&#34; bar&#34;正如你所期望的那样。但是,如果你做了类似的事情:

<强> SomeView.cshtml

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

<强> _SomePartial.cshtml

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

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

答案 1 :(得分:3)

所以这是一种单向传播,如果您想要在部分中设置数据并返回到父视图,您可以使用HttpContext这不是很酷但是有效:

<强>父:

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

<强>部分:

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

输出&#34; somethingelse&#34;在父母身上。

或者,如果您绕过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";
}

输出&#34; somethingelse&#34;在父母身上。