更新: ViewBag コンテンツをプレーンビューではなく部分ビューに設定しようとしていたようですが、MVC3 を使用すると、これを非常に簡単に行うことができます。部分ビューで機能しない理由、つまりビューバッグが部分ビューと共有されない理由にまだ興味があります。
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/Scripts がレイアウト ビューで起動されたときにViewData
、キー「RequiredAssets」が含まれていないことです。
使用法
_Layout.cshtml:
<title>@ViewBag.Title</title>
@Html.RenderAssetStyles()
PartialView.cshtml:
@{
Html.RequireAssets(Assets.Grid, Assets.FileUpload);
}