2012-04-17 88 views
1

更新任意数据:看来我是想设置一个部分鉴于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); 
} 

回答

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

} 
+0

我会尝试打破RequireAssets帮助器,然后每个MvcHtmlStrings检查它们被调用的顺序。我可以实现的唯一“复制”就是将所有内容都放在一个.cshtml文件中,在这种情况下,如果您在RenderAssetStyles/RenderAssetScripts之后调用了RequireAssets,那么在需要它们的调用之前,您将不会设置任何资产。 – 2012-04-17 15:16:04

+0

看来我把视图渲染为部分视图,我已经更新了这个问题。 – 2012-04-20 14:33:17

+0

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

1

认为你做错了什么。无法转载您的努力。尝试检查 - 您的视图是否使用这种布局。这一切都可以尝试创建一个简单的例子,这将是可重复的。

+0

好像我是渲染视图部分,我已经更新的问题。 – 2012-04-20 14:33:38