我有以下方法提供错误
非静态字段,方法或属性需要对象引用< 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();
}
答案 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;
}
希望它有所帮助!
正如@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()