试图在静态方法中使用HttpContext.Session

时间:2017-06-08 19:24:06

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有以下方法提供错误

非静态字段,方法或属性需要对象引用< HttpContext.Session'

namespace Website.Controllers
{

  // CONTROLLER CLASS IS HERE BUT REMOVED AS NOT RELEVANT CODE

  public static class HtmlExtensions
  {
    public static decimal GetCartTotal()
    {
      decimal cartTotal = 0;

      var storedData = HttpContext.Session.GetString(ShoppingCartTotal);

      if (storedData != null)
      {
        cartTotal = JsonConvert.DeserializeObject<decimal>(storedData);
      }

      return cartTotal;
    }
  }
}

显然我理解我是从静态方法调用非静态调用,但我不知道如何创建一个HttpContext.Session对象。我需要该方法是静态的,因为我从视图中调用该数据。我无法传递视图模型中的数据,因为数据正在_Layout.cshtml页面上使用,我不想进入并手动将其添加到每个viewmodel并在每个控制器方法中分配它...什么是在共享视图中调用控制器中的方法的最佳方法?

我在视图中有以下工作,但只有当它是一个静态方法时,因为它是一个静态方法,HttpContext不能正常工作

@using Website.Controllers

@{
  var ShoppingCartTotal = HtmlExtensions.GetCartTotal();
} 

1 个答案:

答案 0 :(得分:2)

您应该从调用者传递方法的依赖项,更好的是在方法中添加一个参数,该参数需要Session对象输入,调用者需要将其传入:

public static decimal GetCartTotal(HttpSessionState session)
{
  decimal cartTotal = 0;

  var storedData = session.GetString(ShoppingCartTotal);

  if (storedData != null)
  {
    cartTotal = JsonConvert.DeserializeObject<decimal>(storedData);
  }

  return cartTotal;
}

希望它有所帮助!

@Edit:

正如@Scott在评论中所建议的那样,您也可以创建一个扩展方法,因为您已经在静态类中创建了它,可以像以下一样编写它:

public static decimal GetCartTotal(this HttpSessionState session)
{
      decimal cartTotal = 0;

      var storedData = session.GetString(ShoppingCartTotal);

      if (storedData != null)
      {
        cartTotal = JsonConvert.DeserializeObject<decimal>(storedData);
      }

      return cartTotal;
}

现在你可以在呼叫方呼叫它,如:

var total = HttpContext.Session.GetCartTotal()