レイアウト (_Layout.cshtml) を使用してすべてのページにデータを表示したいので、親コントローラー クラスを作成し、そのコンストラクターでデータベース アクセスを実行します。これは、セッション変数が存在するかどうかを確認しようとすると、例外 (NullReferenceException) がスローされるため、セッション データにアクセスする場合を除き、うまく機能します。
if (Session["UserId"] != null)
System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。
これは、親クラスに Session オブジェクトがまだ存在しないためだと思います。コードをすべてのアクションコントローラーにコピーした場合にのみ、セッション関連のデータをレイアウトに渡すための別のソリューションを見つけることができません。何か案は?
更新: Dave A、親クラスは次のとおりです。
public class PCMarketController : Controller
{
protected PCMarketContext db = new PCMarketContext();
public PCMarketController()
{
int numberOfCartItems = 0;
if (Session["UserId"] != null) //Throws NullReferenceException in parent, works in action method
{
string UserId = HttpContext.Session["UserId"].ToString();
List<CartItem> CartItems = db.CartItems.Where(i => i.UserId == UserId).ToList();
foreach (var item in CartItems)
{
int count = item.Count;
numberOfCartItems += count;
}
}
ViewBag.NumberOfCartItems = " (" + numberOfCartItems + ")";
List<Category> Categories = db.Categories.ToList();
ViewBag.Categories = Categories;
}
}