未来技術の光と影。
SIYOU’s Chronicle




■内容

 MVC5 で Session情報に配列を記録する方法
 C# を知っていれば簡単なことなのかもしれないが、検索するとなかなかヒットしない。

■解決方法

 下のサンプルではセッション関連の処理を共通化している。
 直接コーディングする場合には、共通処理中の SS の部分を Session に変えればOK。

1.セッション情報の保存

 ・「AccountController」内の「Login」ファンクション内で、ログインに成功した場合、
  UserName を「社員番号」として保存している。

  case SignInStatus.Success:
   // return RedirectToLocal(returnUrl);
   共通Controller.セッション情報保存(Session, model.UserName);
   return RedirectToAction("トップメニュー", "メニュー");
  ...

2.セッション情報の取得

 ・[Authorize]を宣言していても、認証完了後にセッションタイムアウトした場合には、
  コントローラに制御が飛んで来る。
 ・セッションタイムアウトしているか?の判定も兼ねている。

 [Authorize]
 public ActionResult 結果表示([Bind(Include = "店舗番号,累計開始日,累計終了日")] 売上ランキングModels model)
 {
  if (共通Controller.セッション情報取得(Session, model) == false)
   return RedirectToAction("Login", "AccountController");
  ...

 public class 売上ランキングModels
 {
  public decimal 社員番号 { get; set; }
  public int 店舗数 { get; set; }
  public List<decimal> Lst店舗番号;
  public List<string> Lst店舗名;
  ...

3.セッション情報の保存/取得共通処理

 ・保存時は、社員番号から閲覧可能な店舗の一覧を求めて、セッションに保存している。
 ・ただ取得時は、この方法だと取得時用のファンクションが画面ごとに必要となってしまう。

 public class 共通Controller : Controller
 {
  private const string Key社員番号 = "社員番号";
  private const string Key店舗数 = "店舗数";
  private const string Key店舗番号 = "店舗番号";
  private const string Key店舗名 = "店舗名";

  private static 業務DBEntities db = new 業務DBEntities();

  public static void セッション情報保存(HttpSessionStateBase SS, string UserId)
  {
   decimal 社員番号;
   if (decimal.TryParse(UserId, out 社員番号) == false) return;

   担当店舗一覧_Result[] 担当店舗一覧_Result;
   担当店舗一覧_Result = db.担当店舗一覧(社員番号).ToArray();

   List<decimal> Lst店舗番号 = new List<decimal>();
   List<string> Lst店舗名 = new List<string>();

   foreach (担当店舗一覧_Result item in 担当店舗一覧_Result)
   {
    Lst店舗番号.Add(item.店舗番号 ?? 0);
    Lst店舗名.Add(item.店舗名);
   }
   if (Lst店舗番号.Count > 1)
   {
    Lst店舗番号.Insert(0, 0);
    Lst店舗名.Insert(0, "【全店】");
   }

   SS[Key社員番号] = 社員番号;
   SS[Key店舗数] = Lst店舗番号.Count;
   SS[Key店舗番号] = Lst店舗番号;
   SS[Key店舗名] = Lst店舗名;
  }

  public static bool セッション情報取得(HttpSessionStateBase SS, 売上ランキングModels model)
  {
   if (SS.Count == 0) return false;
   model.担当者ID = (int)SS[Key社員番号];
   model.店舗数 = (int)SS[Key店舗数];
   if (model.店舗数 <= 1) return true;
   model.Lst店舗CD = (List<decimal>)SS[Key店舗CD];
   model.Lst店舗名 = (List<string>)SS[Key店舗名];
   return true;
  }

■インデックス
MVC5データベースファーストでちゃっちゃとモバイルサイト
1.MVC5 データベースファースト テーブル値関数の使用方法
2.MVC5 複数項目あるモデルの定義
3.MVC5 ビューでの数値項目右寄せカンマ編集
4.MVC5 BootStrap でのアコーディオン
5.MVC5 データベースファースト ASP.NET Identity に嵌る
6.MVC5 テーブル値関数の再取り込み方法
7.MVC5 Session情報に配列を記録する方法
8.MVC5 AWS へのアップロード方法
9.SQL Server 読み込み専用ユーザの設定方法
10.MVC5 セッションタイムアウト後にLogin画面に戻す方法
11.自己認証による https化
12.LinQ の遅延実行に泣く


コメント ( 0 ) | Trackback ( 0 )