我有一个按钮调用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');
})
答案 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