Asp.net mvc 检查cookies.net mvc中的异常

Asp.net mvc 检查cookies.net mvc中的异常,asp.net-mvc,cookies,Asp.net Mvc,Cookies,在我的控制器的构造函数中,我正在检查是否存在cookie,但我有一个System.NullReferenceException,怎么了 public CartController() { if (Request.Cookies["cart"] != null) { //do something } } 我的猜测是,请求对象在控制器生命周期的那个点没有正确初始化。这段代码可能不应该出现在控制器的构造函数中。

在我的控制器的构造函数中,我正在检查是否存在cookie,但我有一个System.NullReferenceException,怎么了

public CartController()
    {
        if (Request.Cookies["cart"] != null)
        {
            //do something
        }

    }

我的猜测是,
请求
对象在控制器生命周期的那个点没有正确初始化。这段代码可能不应该出现在控制器的构造函数中。而是试着将其付诸行动:

public ActionResult Index()
{
    if (Request.Cookies["cart"] != null)
    {
        //do something
    }
}
如果要跨多个操作共享此代码,请尝试创建一个内部帮助器方法,然后从操作中调用它,如下所示:

private void InitCart()
{
    if (Request.Cookies["cart"] != null)
    {
        //do something
    }
}

public ActionResult Index()
{
    InitCart();
}

我的猜测是,
请求
对象在控制器生命周期的那个点没有正确初始化。这段代码可能不应该出现在控制器的构造函数中。而是试着将其付诸行动:

public ActionResult Index()
{
    if (Request.Cookies["cart"] != null)
    {
        //do something
    }
}
如果要跨多个操作共享此代码,请尝试创建一个内部帮助器方法,然后从操作中调用它,如下所示:

private void InitCart()
{
    if (Request.Cookies["cart"] != null)
    {
        //do something
    }
}

public ActionResult Index()
{
    InitCart();
}

如果使用动作过滤器而不是将代码放在构造函数中,这可能有助于避免代码中的重复

将源自
ActionFilterAttribute
的属性添加到控制器:

[MyActionFilter]
public CartController()
{
}
然后,此筛选器拦截每个操作

 public class MyActionFilter : ActionFilterAttribute

 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
          var request = filterContext.HttpContext.Request;
          // Do something with request....
      }

      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
          // Do anything else if you feel like it.
      }
 }

如果使用动作过滤器而不是将代码放在构造函数中,这可能有助于避免代码中的重复

将源自
ActionFilterAttribute
的属性添加到控制器:

[MyActionFilter]
public CartController()
{
}
然后,此筛选器拦截每个操作

 public class MyActionFilter : ActionFilterAttribute

 {
      public override void OnActionExecuting(ActionExecutingContext filterContext)
      {
          var request = filterContext.HttpContext.Request;
          // Do something with request....
      }

      public override void OnActionExecuted(ActionExecutedContext filterContext)
      {
          // Do anything else if you feel like it.
      }
 }

如果我想把cookies的数据放在构造函数中的一个私有变量中怎么办?@Buboon很难说没有看到更多的代码,但实际上你可能不应该看到。MVC
控制器
应该是无状态的。如果您需要在单个请求期间保存一些数据,只需将其存储在局部变量中,而不是存储在实例属性/字段中。如果必须在请求之间保存一些数据,则可能应将其存储在
会话
临时数据
、后端数据库或其他位置,具体取决于数据的性质。在构造函数中,我将cookie化,并将其保存在私有变量中。在其他方法中,我使用此变量并将结果保存在coockies中。@Buboon在操作开始时将其反序列化为局部变量,操作该变量,将其作为参数传递给可能需要的任何方法,并在操作结束时将其序列化回
Cookies
集合。@Buboon很乐意提供帮助。如果您在实现该解决方案时还有任何问题,您可以随时再次询问。快乐编码:)如果我想把cookies的数据放在构造函数的一个私有变量中怎么办?@Buboon很难说没有看到更多的代码,但实际上你可能不应该看到。MVC
控制器
应该是无状态的。如果您需要在单个请求期间保存一些数据,只需将其存储在局部变量中,而不是存储在实例属性/字段中。如果必须在请求之间保存一些数据,则可能应将其存储在
会话
临时数据
、后端数据库或其他位置,具体取决于数据的性质。在构造函数中,我将cookie化,并将其保存在私有变量中。在其他方法中,我使用此变量并将结果保存在coockies中。@Buboon在操作开始时将其反序列化为局部变量,操作该变量,将其作为参数传递给可能需要的任何方法,并在操作结束时将其序列化回
Cookies
集合。@Buboon很乐意提供帮助。如果您在实现该解决方案时还有任何问题,您可以随时再次询问。快乐编码:)