web-dev-qa-db-ja.com

ASP.NET MVC 4アプリケーションでセッションを使用する方法

私はASP.NET MVCが初めてです。私は以前にPHPを使用していましたが、セッションを作成し、現在のセッション変数に基づいてユーザーレコードを選択するのは簡単でした。

私はC#ASP.NET MVC 4アプリケーションでセッションを作成し使用する方法を私に示すことができる簡単なステップバイステップのチュートリアルをインターネットの至る所で調べました。私は私のコントローラのどこからでもアクセスでき、私のLINQクエリで変数を使用できるようにすることができるユーザ変数でセッションを作成したいです。

-前もって感謝します!

102

やってみる

//adding data to session
//assuming the method below will return list of Products

var products=Db.GetProducts();

//Store the products to a session

Session["products"]=products;

//To get what you have stored to a session

var products=Session["products"] as List<Product>;

//to clear the session value

Session["products"]=null;
148
Jobert Enamno

Webのステートレスな性質により、セッションは、リクエストを直列化してセッションに格納することで、リクエスト間でオブジェクトを永続化する非常に便利な方法です。

このような場合の完璧な使用例は、リクエストごとに追加のデータベース呼び出しを節約するためにアプリケーション全体の通常の情報にアクセスする必要がある場合です。このデータはオブジェクトに格納し、リクエストごとにシリアル化解除できます。

再利用可能な直列化可能オブジェクト:

[Serializable]
public class UserProfileSessionData
{
    public int UserId { get; set; }

    public string EmailAddress { get; set; }

    public string FullName { get; set; }
}

ユースケース:

public class LoginController : Controller {

    [HttpPost]
    public ActionResult Login(LoginModel model)
    {
        if (ModelState.IsValid)
        {
            var profileData = new UserProfileSessionData {
                UserId = model.UserId,
                EmailAddress = model.EmailAddress,
                FullName = model.FullName
            }

            this.Session["UserProfile"] = profileData;
        }
    }

    public ActionResult LoggedInStatusMessage()
    {
        var profileData = this.Session["UserProfile"] as UserProfileSessionData;

        /* From here you could output profileData.FullName to a view and
        save yourself unnecessary database calls */
    }

}

このオブジェクトがいったんシリアル化されれば、それを作成したりデータベースに含まれるデータを再度クエリしたりする必要なく、すべてのコントローラで使用できます。

依存性注入を使用してセッションオブジェクトを注入します

理想的な世界では、 ' 実装ではなくインタフェースにプログラムし '、選択したコントロールの反転コンテナを使用してシリアライズ可能セッションオブジェクトをコントローラに注入します。 (この例では、私が最もよく知っているものとしてStructureMapを使用しています)。

public class WebsiteRegistry : Registry
{
    public WebsiteRegistry()
    {
        this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());   
    }

    public static IUserProfileSessionData GetUserProfileFromSession()
    {
        var session = HttpContext.Current.Session;
        if (session["UserProfile"] != null)
        {
            return session["UserProfile"] as IUserProfileSessionData;
        }

        /* Create new empty session object */
        session["UserProfile"] = new UserProfileSessionData();

        return session["UserProfile"] as IUserProfileSessionData;
    }
}

その後、これをGlobal.asax.csファイルに登録します。

セッションオブジェクトのインジェクションに慣れていない人のために、この件についてのより詳細なブログ記事 をここ に見つけることができます。

警告の言葉:

セッションは最小限に抑える必要があることに注意する必要があります。大きなセッションはパフォーマンスの問題を引き起こす可能性があります。

機密データ(パスワードなど)を格納しないこともお勧めします。

59
Joseph Woodward

これは、セッション状態がASP.NETおよびASP.NET MVCでどのように機能するかです。

ASP.NETセッション状態の概要

基本的には、Sessionオブジェクトに値を格納するためにこれを行います。

Session["FirstName"] = FirstNameTextBox.Text;

値を取得するには

var firstName = Session["FirstName"];
16

次のようにして、セッションにあらゆる種類のデータを保存できます。

Session["VariableName"]=value;

この変数は約20分続きます。

0
Ulyses