0

レイアウト (_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;
    }
}
4

1 に答える 1

1

Session の理由が null であると想定するのは正しいです。ControllerBuilder によってページ ライフ サイクルの後半に挿入されるセッション HttpContext.Session。

通常、このような場合はコントローラーの OnActionExecuting メソッドをオーバーライドします ( http://msdn.microsoft.com/en-au/library/system.web.mvc.controller.onactionexecuting(v=vs.98).aspx )。

セッションを使用すると、標準の単体テストによるコントローラーのテスト可能性が妨げられる可能性があることに注意してください。

乾杯

于 2013-02-02T14:26:14.357 に答える