更新:我似乎试图在部分视图中设置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);
}
答案 0 :(得分:1)
认为你做错了什么。无法再现你的努力。尝试检查 - 您的View是否使用完全相同的布局。这一切都可以尝试创建可重现的简单示例。
答案 1 :(得分:1)
我无法重现这一点。我不得不简化你的代码并做出一些假设。但以下对我来说很好。
_Layout.cshtml
@using MyProject.Helpers
<title>@ViewBag.Title</title>
@Html.RenderAssetStyles()
@Html.RenderAssetScripts()
@RenderBody()
View.cshtml
@using MyProject.Helpers
@{
ViewBag.Title = "View";
Html.RequireAssets(Asset.Grid, Asset.FileUpload);
Layout = "~/Views/Shared/_Layout.cshtml";
}
Helpers.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyProject.Helpers
{
public enum Asset
{
Grid=1,
FileUpload=2
}
public static class Helper
{
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 : MvcHtmlString.Create("Test Style");
}
public static MvcHtmlString RenderAssetScripts(this HtmlHelper helper)
{
var requiredAssets = helper.ViewData["RequiredAssets"] as List<Asset>;
return requiredAssets == null ? null : MvcHtmlString.Create("Test Script");
}
}
}