2012-04-17 7 views
1

更新:私が平野ビューの代わりに部分ビューでViewBag内容を設定しようとしていたようで、MVC3はこれを行うには、それは非常に簡単になります。私はまだ部分的なビューではうまくいかず、なぜビューバックが部分的なビューと共有されていないのかについてはまだ興味があります。レイアウトビューへの部分的なビューからのパスを任意のデータ

私は問題がレイアウトビューで焼成されたときにRenderAssetStyles /スクリプトViewDataにはないということです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()); 
} 

を使用してレイアウトビューに部分図からいくつかのデータを渡すためにしようとしています

:キー "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のそれぞれを呼び出す順序をチェックしようとします。唯一の「再現」は、RenderAssetStyles/RenderAssetScriptsの後にRequireAssetsが呼び出された場合、必要な呼び出しの前にアセットが設定されていない場合に、.cshtmlですべてを取得することでした。 –

+0

私はビューを部分的にレンダリングしていたようですが、質問を更新しました。 –

+0

http://stackoverflow.com/questions/4974027/modifying-mvc-3-viewbag-in-a-partial-view-does-not-persist-to-the-layout-cshtmlが役立つ可能性があります –

1

は、あなたが何か間違ったことをやって考えてみてください。努力を再現することはできません。あなたのビューがこのレイアウトに合っているか確認してみてください。それはすべて再現可能な簡単な例を作成しようとすると大丈夫です。

+0

私が、私は質問を更新しました、など一部のビューをレンダリングしているようです。 –

関連する問題