1

我有一个调用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 变量的检索似乎发生在视图渲染之前,它利用了布局,或者我不确定如何获取 ViewBag 变量以成功设置按钮的选定类。

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

2 回答 2

0

它应该是这样的:

var seltab = "@ViewBag.SelectedTab";
于 2013-08-15T16:23:34.387 回答
0

AViewBag的生命周期只针对一个请求。当您的SetSelectedTab操作被调用时,您设置ViewBag.SelectedTab了,但是一旦操作完成并将 JSON 结果发送到客户端,该操作ViewBag就会被销毁。在下一个请求中ViewBag是空的。

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

有关这方面的更多信息,您可以查看以下 SO 问题: ViewData、ViewBag、Session、TempData 的正确时间是什么时候

于 2013-08-15T16:41:33.173 回答