簡體   English   中英

嘗試在靜態方法中使用HttpContext.Session

[英]Trying to use HttpContext.Session in a static method

我有以下給出錯誤的方法

非靜態字段,方法或屬性'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頁面上正在使用該數據,並且我不想進入並將其手動添加到每個視圖模型並在每個控制器方法中對其進行分配的原因。共享視圖中的控制器中調用方法的最佳方法?

我在View中有以下有效的視圖,但僅當它是靜態方法時才有效,因為它是HttpContext不起作用的靜態方法

@using Website.Controllers

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

您應該從調用方傳遞方法的依賴關系,更好的方法是在采用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM