Update: It seems I was trying to set the ViewBag content in a partial view instead in a plain view, MVC3 makes it very easy to do this. I'm still interested why it doesn't work for partial views, i.e. why isn't the viewbag shared with partial views.
I'm trying to pass some data from a partial view to the layout view by using 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());
}
The problem is that when RenderAssetStyles/Scripts is fired in the layout view the ViewData
does not contain the key "RequiredAssets"
Usage
_Layout.cshtml:
<title>@ViewBag.Title</title>
@Html.RenderAssetStyles()
PartialView.cshtml:
@{
Html.RequireAssets(Assets.Grid, Assets.FileUpload);
}