0

我有一个 SiteNavigation 类,它在我的基本控制器的 Initialize 事件中被更新,例如

[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)

我已经尝试将导航对象转换回变量并以这种方式设置属性,没有骰子。任何帮助,将不胜感激。

叫我莫名其妙!

谢谢你,斯蒂芬

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方法。此外,我从我的UserContext类中获取属性状态,每个会话仅注册一次:builder.RegisterType().As().CacheInSession(); . 基本信息:我使用DependcyInjection

将过滤器分配给控制器:

控制器:

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

过滤属性类:

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 回答