ASP.NET MVCは初めてです。以前にPHPを使用したことがあり、セッションを作成し、現在のセッション変数に基づいてユーザーレコードを選択するのは簡単でした。
C#ASP.NET MVC 4アプリケーションでセッションを作成して使用する方法を示す簡単なステップバイステップチュートリアルをインターネットの至る所で探しました。コントローラーの任意の場所からアクセスできるユーザー変数を使用してセッションを作成し、LINQクエリで変数を使用できるようにしたいと考えています。
ASP.NET MVCは初めてです。以前にPHPを使用したことがあり、セッションを作成し、現在のセッション変数に基づいてユーザーレコードを選択するのは簡単でした。
C#ASP.NET MVC 4アプリケーションでセッションを作成して使用する方法を示す簡単なステップバイステップチュートリアルをインターネットの至る所で探しました。コントローラーの任意の場所からアクセスできるユーザー変数を使用してセッションを作成し、LINQクエリで変数を使用できるようにしたいと考えています。
回答:
試す
//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;
WebSecurity.CurrentUserId
、データベースから何度もプルしないように、取得した値を保存しても安全ですか(非常にコストがかかることがわかりました)?
Account/LogOn
からHome/Index
)Session["FirstName"]
はになりnull
ます。開発者は、親コントローラー(BaseController
)を作成し、internal protected HttpSessionStateBase SharedSession
すべてのサブコントローラーで共有セッション変数を公開する保護フィールド()を定義する必要があります(これは、すべてのアプリコントローラーがから継承することを前提としていますBaseController
)
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 */
}
}
このオブジェクトがシリアル化されると、それを作成したり、データベース内に含まれるデータを再度データベースに照会したりする必要なく、すべてのコントローラーで使用できます。
依存性注入を使用してセッションオブジェクトを注入する
理想的な世界では、「実装ではなくインターフェイスにプログラミング」し、選択したInversion of Controlコンテナーを使用して、シリアル化可能なセッションオブジェクトをコントローラーに挿入します(この例では、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
ファイルに登録します。
セッションオブジェクトの挿入に慣れていない方のために、この件に関するより詳細なブログ投稿をここで見つけることができます。
警告の言葉:
セッションは最小限に抑える必要があることに注意してください。大きなセッションはパフォーマンスの問題を引き起こし始める可能性があります。
機密データ(パスワードなど)を保存しないこともお勧めします。
これは、ASP.NETおよびASP.NET MVCでセッション状態がどのように機能するかです。
基本的に、これを実行して、Sessionオブジェクトに値を格納します。
Session["FirstName"] = FirstNameTextBox.Text;
値を取得するには:
var firstName = Session["FirstName"];
Account
に別のコントローラーを要求するとHome
、Session ["FirstName"]はnullになります。開発者は、すべてのサブコントローラーで共有変数を公開BaseController
する保護フィールド(internal protected HttpSessionStateBase SharedSession
)を作成して定義する必要がありますSession
(これは、すべてのアプリコントローラーがから継承することを前提としていますBaseController
)
Uは、Session ["FirstName"] = FirstNameTextBox.Text;のようなセッションに任意の値を格納できます。しかし、モデルの静的フィールドとして値を割り当てることをuに推奨します。uは、アプリケーションの任意の場所でそのフィールド値にアクセスできます。セッションは必要ありません。セッションは避けてください。
public class Employee
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public static string FullName { get; set; }
}
コントローラ上-Employee.FullName = "ABC"; これで、アプリケーションのどこからでもこのフルネームにアクセスできます。