ASP.NET MVC3在重新加载时为Layout.cshtml中的按钮设置类

时间:2013-08-15 16:08:56

标签: jquery asp.net-mvc-3

我有一个按钮调用Url.Action到不同视图的场景。加载视图后,我想设置适当的按钮(作为选项卡)进行选择。设置ViewBag中的值并尝试检索它会产生空字符串。

“布局”页面通过AJAX调用设置所选按钮的值,然后将其重新加载为

$(function () {
        var tab = "My Lists";
        $('#btnMyLists').click(function () {
            $.ajax({
                type: "POST",
                url: '@Url.Action("SetSelectedTab", "Home")',
                datatype: "json",
                data: { "tab": tab },
                success: function (response) {
                    window.location.href = '@Url.Action("MyLists", "AssocLists")';
                },
                error: function (errordata) {
                }
            });
        });
    });

我添加了一种方法,用于将所选选项卡的状态存储在Home Controller中的ViewBag中

    [HttpPost]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public ActionResult SetSelectedTab(string tab)
    {
        ViewBag.SelectedTab = tab;
        return new JsonResult { Data = new { Ok = true, message = string.Empty } };

    }

但似乎ViewBag变量的检索似乎是在渲染视图之前发生的,它利用了Layout,或者我不确定如何获取ViewBag变量来成功设置按钮的选定类。

$(function () {
        //DOES NOT WORK - EMPTY STRING
        var seltab = "@(ViewBag.SelectedTab)";
        if (seltab.length > 0 && seltab == "My Lists")
           $(btnMyLists).addClass('homepageHeaderButtonActive').siblings().removeClass('homepageHeaderButtonActive');
})

2 个答案:

答案 0 :(得分:0)

应该是这样的:

var seltab = "@ViewBag.SelectedTab";

答案 1 :(得分:0)

ViewBag的生命周期仅适用于一个请求。调用SetSelectedTab操作后,您设置ViewBag.SelectedTab,但一旦操作完成并将JSON结果发送到客户端,ViewBag就会被销毁。在下一个请求中,ViewBag为空。

您应该做的是在视图中创建一个隐藏字段(<input name="selectedTab" type="hidden"...),当选定的标签更改时,您应该在隐藏字段中设置值(在客户端,在JS中)。当该表单提交给服务器时,您从那里读取值而不是从ViewBag读取。另一个选择是使用Session而不是ViewBag,但我不推荐它用于这样一个简单的场景。

有关此内容的更多信息,请查看以下SO问题: What is the right time for ViewData, ViewBag, Session, TempData