Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为我的asp.net MVC站点的每个访问者添加cookie?_C#_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 如何为我的asp.net MVC站点的每个访问者添加cookie?

C# 如何为我的asp.net MVC站点的每个访问者添加cookie?,c#,asp.net-mvc,asp.net-mvc-3,C#,Asp.net Mvc,Asp.net Mvc 3,我正在试验一个ASP.NETMVC3站点,使用razor作为视图引擎。我需要为我网站的每个访问者分配一个cookie。做这件事的最佳地点/方式是什么? 请详细说明,因为我是ASP.NET的新手。您已经有了会话和会话cookie 但是,如果需要将特定值写入cookie,则可以从控制器访问响应流 this.Response.Cookies.Add()在控制器内部(这不是必需的)应在控制器中设置cookie。您可以这样设置cookie: Response.Cookies.Add(new HttpCoo

我正在试验一个ASP.NETMVC3站点,使用razor作为视图引擎。我需要为我网站的每个访问者分配一个cookie。做这件事的最佳地点/方式是什么?
请详细说明,因为我是ASP.NET的新手。

您已经有了会话和会话cookie

但是,如果需要将特定值写入cookie,则可以从控制器访问响应流


this.Response.Cookies.Add()在控制器内部(这不是必需的)

应在控制器中设置cookie。您可以这样设置cookie:

Response.Cookies.Add(new HttpCookie(cookieName, cookieValue));
如果需要在视图中获取值,最好的方法是在控制器中获取该值,并将其粘贴到视图模型或视图状态中:

var cookie = Response.Cookies[cookieName];
ViewData["CookieInfo"] = cookie.Value;
在你看来:

@ViewData["CookieInfo"]

无论用户第一次进入哪个页面,这都会起作用。 您可以使用基本控制器继承控制器,然后向OnActionExecuting方法添加一些信息

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext context)
    {
        HttpCookie myCookie = Request.Cookies[keyOfSomeKind];

        if (myCookie == null)
        {
            HttpCookie newCookie
                = new HttpCookie(keyOfSomeKindy, "Some message");
            newCookie.Expires = DateTime.Now.AddMinutes(3);
            current.Response.Cookies.Add(newCookie);
        }

        base.OnActionExecuting(context);
    }
}

有3种方法可以在不破坏mvc模式的情况下实现它:

1-在
OnActionExecuting
/
OnActionExecuted
/
OnResultExecuting
方法中具有指定行为的基本控制器类(如果此行为在整个网站中是必需的

2-在
OnActionExecuting
/
OnActionExecuted
/
OnResultExecuting
方法中创建具有指定行为的操作筛选器:

public class MyCookieSettingFilterAttribute : ActionFilterAttribute 
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.Cookies.Add(new HttpCookie(name, value));
    }
}

将筛选器属性指定给某些控制器/操作(如果此行为对于所有网站都不是必需的),例如

[MyCookieSettingFilter]
public class MyHomeController : Controller
{
}

3-在
OnActionExecuting
/
OnActionExecuted
/
OnResultExecuting
方法中创建具有指定行为的操作筛选器,并在
全局中注册它。asax
-它将适用于所有控制器的所有操作(如果所有网站都需要此行为)


我不建议使用基本控制器方式,因为它的可扩展性不如全局过滤器方式。使用不同的全局筛选器来提供不同的独立全局行为。

Cookie被添加到响应中,而不是请求中。它们是从请求中读取的。如果你这样做的话,我大概97%肯定ASP.NET不会试图帮助你,也不会在响应中为你添加cookie。在我看来,这更适合作为操作过滤器而不是基本控制器。克里斯,你能详细说明一下吗?因为这对我来说是一个理想的解决方案,因为目前我的代码中已经有一个basecontroller类。。我很好奇动作过滤器的优点是什么。我想作为动作过滤器会更好,因为它使您的使用更加松散耦合。选择装饰或不装饰控制器和操作要比添加和撤消基本控制器简单得多。在MVC中,基本控制器倾向于(或导致)代码气味。关于基本控制器为什么会导致代码气味的例子,请看上面的代码。假设您有一个控制器,其中对于1个特定操作,您绝对不能创建cookie。此时,除了破解基本控制器以支持您的边缘案例,或者从原始控制器中删除操作并创建一个新控制器以服务于不依赖于该基本控制器的单个操作之外,您别无选择;我知道如何添加cookie,核心问题是如何/在何处为每个访问者添加cookie。感谢Chris的回复,我不使用会话cookie的原因是该网站与传统(经典)asp网站共享一个数据库。在该站点中,我们使用UUID cookie链接到数据库中存储的每个用户的数据。这使我们可以在服务器重新启动之间或用户注销后再次登录时维护用户的状态。@Rico Suave请记住,不要担心从cookie窃取中劫持会话。并确保您使用的cookies是HttpOnly,并评估您是否也只想使用SSL。啊,清除,因此过滤器允许对您希望应用cookie的位置进行更细粒度的控制。我将不得不考虑我们是否需要为每个用户在每个页面上设置cookie。。。感谢您的详细解释。是的,使用过滤器属性可以提供更细粒度的控制。您可以向属性构造函数添加参数(例如mycokiesaddingattribute(字符串名称)),申请控制器[mycokiesadding(“A”)],并覆盖某些操作[mycokiesadding(“B”)]。这是一个非常强大的机制。感谢这个例子,Evgeny,我不知道这些过滤器。Rico,看起来你也可以选择将过滤器添加到global.asax中,使其成为全局过滤器-
public class MyAccountController : Controller
{
    [MyCookieSettingFilter]
    public ActionResult Login()
    {
    }
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new MyCookieSettingFilterAttribute());
}