ActionResult之外的Cookie代码

时间:2018-01-25 15:40:29

标签: c# asp.net-mvc cookies

我想使用Cookie来识别用户。我已经学会了如何做到这一点,但是我不能在普通方法中使用我的代码并从ActionResult方法中访问它。我曾想过创建一个获取名称的ActionResult,然后返回将名称作为参数传递的真实ActionResult。但这看起来很乱,特别是考虑到一些ActionResult方法已经有参数了!

this question的第一个答案看起来很有希望。它建议为HttpContext创建一个扩展方法,这是有道理的。这是我的实施:

public static class ExtensionHelper
{
    public static string UserIdentity(this HttpContext context)
    {
        string userName;
        HttpCookie cookie = context.Request.Cookies["userNameCookie"];
        if (cookie == null)
        {
            userName = CookiesCounter.ReturnNewestID();
            cookie = new HttpCookie("userNameCookie", userName);
            cookie.Expires = DateTime.Now.AddDays(31);
            context.Response.Cookies.Add(cookie);
        }
        else
        {
            userName = cookie.Value;
        }
        return userName;
    }
}

但是当我打电话时

HttpContext.UserIdentity();

在我的控制器中,我得到的抱怨是:“HttpContextBase不包含UserIdentity的定义,最好的扩展方法重载需要HttpContext类型的接收器”。

从我天真的角度来看(新的扩展方法和cookie)看起来我的代码是答案中提供的代码的副本;我究竟做错了什么?谢谢!

2 个答案:

答案 0 :(得分:2)

首先,您应该查看HttpContext属性的类型。它是HttpContextBase,表示您的扩展参数应为this HttpContextBase而不是this HttpContext

然后您需要using您的扩展程序所在的namespace才能使用它

答案 1 :(得分:0)

您可以使用动作过滤器。动作过滤器在您的动作方法之前被调用。