2012-04-11 121 views
0

我有一個SiteNavigation類正在我的基礎控制器的Initialize事件中進行更新,例如爲什麼ViewBag中的項目不會傳播到_Layout頁面?

[Serializable] 
public class SiteNavigation 
{ 

    public SiteNavigation() 
    { 
     IsSummarySelected = true; 
    } 

    public Model.Dtos.Folder[] Folders { get; set; } 


    public bool IsSummarySelected { get; set; } 

} 

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 

    var siteNavigation = new SiteNavigation(); 

    siteNavigation.Folders = GetMeMyFolders() as Folder[]; 

    ViewBag.SiteNavigation = siteNavigation; 

} 

並在控制器中IsSummarySelected屬性更改爲此值。

ViewBag.SiteNavigation.IsSummarySelected = false; 

當我使用這行代碼訪問_Layout文件中的屬性時,該值始終爲真。就好像nav對象再次被新建起來並且構造函數將其設置爲true。

@if (ViewBag.SiteNavigation.IsSummarySelected) 

我試着將nav對象轉換回變量並設置屬性,方式也沒有骰子。任何幫助,將不勝感激。

叫我困惑!

謝謝 斯蒂芬

回答

1

我只是複製粘貼代碼到我的樣本MVC項目,並在我的行動改變IsSummarySelected正確地反映在_layout文件。你確定你的控制者的任務正在受到打擊,並且你以後不在其他地方重新分配?

編輯:您的問題是爲什麼我認爲將ViewBag用於除本地化快速修復之外的其他任何內容都不好的示例。調試動態全局對象並不好玩。重構建議:讓網站導航屬性在你的基地控制器

SiteNavigation siteNavigation; 
public SiteNavigation SiteNavigation 
{ 
    get 
    { 
     return siteNavigation; 
    } 
    set 
    { 
     siteNavigation = value; 
    } 
} 

,並用此來替換所有ViewBag.SiteNavigation引用。然後創建一個自定義WebViewPage並放入它。

public SiteNavigation SiteNavigation 
{ 
    get 
    { 
     return ((BaseController)ViewContext.Controller).SiteNavigation; 
    } 
} 

這不會解決你的問題,但現在你可以貼在站點導航的獲取和設置屬性斷點,它應該是很容易的,現在調試您的問題。

+0

@SPATEN你有沒有得到它的工作? – DMulligan 2012-04-23 19:13:58

+0

@AFinkelstien Initialize方法適用於我正在做的事情,但我擺脫了IsSummarySelected屬性來代替通過路由進行。感謝您的幫助! – 2012-05-12 16:57:07

0

我填補我的TempData [ 「SplitterIsCollapsed」]過濾器通過 OnResultExecuting方法調用即可。此外,我從我的 UserContext類中獲取屬性狀態,該類僅在每個會話中註冊一次: builder.RegisterType()。As()。CacheInSession();。 基本信息:我使用依賴注塑

分配過濾器到控制器的:

控制器:

[LayoutTempData] 
public class HomeController : Controller 
{ 
    //.... 
} 

FilterAttribute類:

namespace MyProject.Web.Infrastructure.Filters 
{ 
    public class LayoutTempDataAttribute : ActionFilterAttribute 
    { 
     private readonly IUserContext _userContext; 
     public LayoutTempDataAttribute() 
     { 
      _userContext = DependencyResolver.Current.GetService<IUserContext>(); 
     } 

     public override void OnResultExecuting(ResultExecutingContext context) 
     { 
      if (context.Controller.TempData.ContainsKey("SplitterIsCollapsed")) 
       context.Controller.TempData["SplitterIsCollapsed"] = _userContext.LayoutInformation.SplitterIsCollapsed; 
      else 
       context.Controller.TempData.Add("SplitterIsCollapsed", _userContext.LayoutInformation.SplitterIsCollapsed); 
     } 
    } 
} 

_layout的分配器部分。cshtml的樣子:

@{Html.Telerik().Splitter().Name("Splitter1") 
    .Panes(panes => 
     { 
      panes.Add() 
       .Size("300px") 
       .Collapsible(true) 
       .Collapsed((bool)TempData["SplitterIsCollapsed"]) 
       .Content(<div>asdfasdf</div>); 
      panes.Add() 
       .Collapsible(false) 
       .Scrollable(false) 
       .Content(<div>content2</div>); 
     }) 
    .Render(); 
} 
相關問題