更新任意数据:看来我是想设置一个部分鉴于ViewBag内容,而不是一个平原观点,MVC3使得它很容易做到这一点。我仍然感兴趣的是为什么它不适用于部分视图,即为什么viewbag与部分视图不共享。通行证从局部视图布局视图
我试图用ViewData
/ViewBag
// Used in the partial view
public static void RequireAssets(this HtmlHelper helper, params Asset[] assets)
{
var alreadyRequired = helper.ViewData["RequiredAssets"] as List<Asset>;
if (alreadyRequired == null)
{
alreadyRequired = new List<Asset>();
helper.ViewData.Add("RequiredAssets", alreadyRequired);
}
foreach (var asset in assets.Where(anAsset => !alreadyRequired.Contains(anAsset)))
alreadyRequired.Add(asset);
}
// Used in the layout view
public static MvcHtmlString RenderAssetStyles(this HtmlHelper helper)
{
var requiredAssets = helper.ViewData["RequiredAssets"] as List<Asset>;
return requiredAssets == null ? null : GetStyleSheets(requiredAssets.Select(e => new StyleSheet(e)).ToArray());
}
public static MvcHtmlString RenderAssetScripts(this HtmlHelper helper)
{
var requiredAssets = helper.ViewData["RequiredAssets"] as List<Asset>;
return requiredAssets == null ? null : GetScripts(requiredAssets.Select(e => new Script(e)).ToArray());
}
问题从局部视图布局视图通过一些数据是,当RenderAssetStyles /脚本布局烧制查看ViewData
不包括键 “RequiredAssets”
使用
_Layout.cshtml:
<title>@ViewBag.Title</title>
@Html.RenderAssetStyles()
PartialView.cshtml:
@{
Html.RequireAssets(Assets.Grid, Assets.FileUpload);
}
我会尝试打破RequireAssets帮助器,然后每个MvcHtmlStrings检查它们被调用的顺序。我可以实现的唯一“复制”就是将所有内容都放在一个.cshtml文件中,在这种情况下,如果您在RenderAssetStyles/RenderAssetScripts之后调用了RequireAssets,那么在需要它们的调用之前,您将不会设置任何资产。 – 2012-04-17 15:16:04
看来我把视图渲染为部分视图,我已经更新了这个问题。 – 2012-04-20 14:33:17
http://stackoverflow.com/questions/4974027/modifying-mvc-3-viewbag-in-a-partial-view-does-not-persist-to-the-layout-cshtml可能有帮助 – 2012-04-20 21:24:19