0

ベースコントローラーのInitializeイベントで更新されているSiteNavigationクラスがあります。

[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ファイルのプロパティにアクセスすると、値は常にtrueになります。これは、navオブジェクトが再び新規作成され、コンストラクターがそれをtrueに設定しているようです。

 @if (ViewBag.SiteNavigation.IsSummarySelected)

navオブジェクトを変数にキャストし直して、プロパティもそのように設定してみました。サイコロはありません。どんな助けでもいただければ幸いです。

困惑したと呼んでください!

ありがとう、スティーブン

4

2 に答える 2

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

これで問題が解決することはありませんが、SiteNavigationのgetプロパティとsetプロパティにブレークポイントを設定するだけで、問題のデバッグが非常に簡単になります。

于 2012-04-11T22:32:09.963 に答える
0

フィルタが呼び出されたときにTempData["SplitterIsCollapsed"]を入力し、次にOnResultExecutingメソッドを使用します。さらに、セッションごとに1回だけ登録されるUserContextクラスからプロパティの状態をフェッチします。builder.RegisterType()。As()。CacheInSession(); 。基本情報:DependcyInjectionを使用しています!

コントローラへのフィルタの割り当て:

コントローラ:

[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のSplitter部分は次のようになります。

@{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();
 }
于 2012-12-13T15:44:12.753 に答える