123

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

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

4

5 に答える 5

167

試す

//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;
于 2013-01-03T12:34:45.343 に答える
67

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ます。

セッション オブジェクトの注入に慣れていない方は、この件に関するより詳細なブログ投稿をこちらで参照できます。

警告の言葉:

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

また、機密データ (パスワードなど) を保存しないことをお勧めします。

于 2013-12-20T11:50:37.787 に答える
17

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

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

基本的に、Session オブジェクトに値を格納するには、次のようにします。

Session["FirstName"] = FirstNameTextBox.Text;

値を取得するには:

var firstName = Session["FirstName"];
于 2013-01-03T12:25:00.933 に答える
-8

U は Session["FirstName"] = FirstNameTextBox.Text; のようにセッションに任意の値を格納できます。ただし、モデルの静的フィールドとして値を割り当てることをお勧めします。これにより、アプリケーションのどこからでもそのフィールド値にアクセスできます。セッションは必要ありません。セッションは避けるべきです。

public class Employee
{
   public int UserId { get; set; }
   public string EmailAddress { get; set; }
   public static string FullName { get; set; }
}

コントローラー上 - Employee.FullName = "ABC"; これで、アプリケーションのどこからでもこの完全な名前にアクセスできます。

于 2016-04-20T14:03:19.350 に答える