1

更新:似乎我试图在局部视图中设置 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()

部分视图.cshtml:

@{ 
    Html.RequireAssets(Assets.Grid, Assets.FileUpload); 
}
4

2 回答 2

1

认为你做错了什么。无法复制你的努力。尝试检查 - 您的视图是否使用精确的这种布局。这一切都可以尝试创建可重现的简单示例。

于 2012-04-17T15:09:22.203 回答
1

我无法重现这一点。我不得不简化你的代码并做出一些假设。但以下对我来说很好。

_Layout.cshtml

@using MyProject.Helpers
<title>@ViewBag.Title</title>    
@Html.RenderAssetStyles()
@Html.RenderAssetScripts()
@RenderBody()

查看.cshtml

@using MyProject.Helpers
@{ 
    ViewBag.Title = "View";
    Html.RequireAssets(Asset.Grid, Asset.FileUpload);
    Layout = "~/Views/Shared/_Layout.cshtml";
}

助手.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");
        }
    }

}
于 2012-04-17T15:12:37.400 回答