我以前一直使用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。
以前有人让这个上班吗?我忽略了什么吗?
由于
答案 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;在父母身上。