c# – 为什么我的Session [“value”]不能跨视图持续存在(asp.net mvc)

前端之家收集整理的这篇文章主要介绍了c# – 为什么我的Session [“value”]不能跨视图持续存在(asp.net mvc)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我选择进行会话来存储一个值,我需要调用并更新一些控制器和视图.我知道可以使用Baseviewmodel.cs做类似的事情,或者更少的会话-y,但我试图看看Session如何能够解决我的需求.这就是我正在做的事情:

我有一个局部视图,在我的_layout页面上呈现如下:

@Html.Action("OrgSwitch",new { controller = "Common",area = "InkScroll" })

这是一个包含登录用户组织的下拉列表.它命中了一个CommonController,负责处理在布局页面上渲染模型绑定逻辑的事情.在CommonController中我有这个视图和回发,如下所示:

[ChildActionOnly]
    public ViewResult OrgSwitch()
    {
        var userOrgs = new List<SelectListItem>();
        var user = Ctx.Users.FirstOrDefault(x => x.UserName == User.Identity.Name);
        int key = 0;
        if (user.Organizations.Count > 0)
        {
            TempData["HasOrgs"] = true;
            foreach (var org in user.Organizations)
            {
                if (Session["SelectedOrgKey"] == null)
                {
                    //currently setting selected by primary org id
                    //todo: set selected to tempdata selectedOrgId if there is one.
                    userOrgs.Add(org.OrganizationId.ToString() == user.PrimaryOrgId
                        ? new SelectListItem { Text = org.Name,Value = org.OrganizationId.ToString(),Selected = true }
                        : new SelectListItem { Text = org.Name,Selected = false });
                }
                else
                {
                    key = Convert.ToInt32(Session["SelectedOrgKey"]);
                    userOrgs.Add(org.OrganizationId == key
                        ? new SelectListItem { Text = org.Name,Selected = false });
                }
            }

            ViewBag.UserOrgs = userOrgs.OrderBy(x => x.Text);
        }
        else
        {
            ViewBag.UserOrgs = userOrgs;
            TempData["HasOrgs"] = false;
        }
        Session["SelectedOrgKey"] = key;
        return View();
    }

    [HttpPost]
    public RedirectToRouteResult OrgSwitch(string UserOrgs)
    {
        Session["SelectedOrgKey"] = UserOrgs;
        return RedirectToAction("Index","Recruiter",new { orgId = UserOrgs,area = "InkScroll" });
    }

这或多或少的初始加载将呈现下拉列表并将其默认为用户主要组织.如果他们选择了某些内容并回发了该选项,则默认情况下会在后续页面显示所选内容.

尝试和失败

我正在尝试各种方式来利用Session值. viewresult中的一个区域:

[ChildActionOnly]
    public ViewResult StaffList()
    {
        var user = Ctx.Users.FirstOrDefault(x => x.UserName == User.Identity.Name);

        var model = new List<StaffListviewmodel>();
        int key = Convert.ToInt32(Session["SelectedOrgKey"]);
        var org = user.Organizations.FirstOrDefault(x => x.OrganizationId == key);
        if (org.RegisteredMembers != null)
        {
            foreach (var req in org.RegisteredMembers)
            {
                model.Add(new StaffListviewmodel
                {
                    UserName = req.UserName,Name = (req.FirstName ?? "") + " " + (req.LastName ?? ""),ImageLocation = req.ImageLocation
                });
            }
        }
        Session["SelectedOrgKey"] = key;
        return View(model);
    }

在这里’钥匙’空出来了.

另一个尝试是将它放在布局cshtml文件中,如下所示:

<li><a href="@Url.Action("Staff",new {area="",orgId = Convert.ToInt32(Session["SelectedOrgId"])})">Staff</a></li>

在这一个中,如果我将鼠标悬停在链接上,则orgId总是等于0.我是否在某处弄乱了?真的,我需要将这个SelectedOrgId用于应用程序的任何页面.

解决方法

后人的答案:

问题中的代码是否有效.我在asp.net mvc中设置和调用会话的方式很好.如果你来到这里是徒劳的搜索以使会话工作,那么继续看我猜.我遇到的问题与我的控制流和我传入的参数有关.一旦我从上面的参数中删除了’orgId’,我重构了if / else的东西,只看会话.所以问题是我正在处理的app中的某个地方,orgId没有从’0’改变.无论如何,我是一个白痴,但至少我可以快速概述一下asp.net mvc中的Session会是什么以及使用起来有多简单:

设置应用程序以使用会话

会话默认为正在进行,超时为20分钟.如果您觉得某些内容覆盖了默认设置,您可以在web.config中明确设置它(标准asp.net mvc应用程序上的root web.config):

<system.web>
    <sessionState mode="InProc" timeout="60"></sessionState>
    ...other stuff..
</system.web>

我将超时设置为60分钟以上,因为我希望它能够保持一段时间.标准是20.

设置会话变量

非常简单.做这个:

Session["MyStringVariable"] = "Some value I want to keep around";
Session["MyIntegerVariable"] = 42;

检索会话变量

再次,非常简单,你只需要注意将变量转换/转换为适合你的变量.

var localVar = Session["MyStringVariable"].ToString();
var anotherLocalVar = Convert.ToInt32(Session["MyIntegerVariable"] = 42);

所以,是的,我做得对,但是由于我上面的代码中的其他复杂性,我指责了重大的不好的会话而不是我的大脑.

希望这有助于某人! (如果我的上述信息有误,请告诉我,我会更新!).

猜你在找的C#相关文章