質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • C#

    6880questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    510questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • ASP.NET MVC 4

    62questions

    ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。

ASP.NET MVC におけるSession処理について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 5,711

nature_

score 144

ASP.NET MVC5のSessionについて質問させていただきます。
動作確認のため以下のようなメソッドを作成し、メインビューとメインビュー内にあるボタンクリックで呼び出される部分ビューから呼び出しています。
public static test()
{
  var page = new Page();
  page.Session["ses"] = true;
  var ses = (bool)page.Session["ses"];
  return ses;
}
メインビューでは正常にSessionの登録ができているのですが、部分ビューからですと「page.Session["ses"] = true;」のところで以下のようなhttpExceptionが発生してしまいます。
セッション状態は、構成ファイルまたは Page ディレクティブで enableSessionState が true に設定されているときのみ使用できます。System.Web.SessionStateModule またはカスタム セッション状態モジュールがアプリケーション構成の <configuration>\<system.web>\<httpModules> セクションに含まれていることも確認してください。
部分ビュー(html.Partial)からはSessionの利用に何か壁があるのでしょうか・・・どなたかご意見よろしくお願いいたします。

9/29追記:
部分ビューはajaxで呼び出されるため、HttpContextが取れない(?)ようです。。。
追加コード
-- メインビューで以下を記述して部分ビューの呼び出し
@Html.Partial("部分ビュー")

-- 部分ビューで以下を記述して上記メソッド呼出し
@namespace.Sample.test()
結果 :
最初に画面を開くと、メインビュー-部分ビュー-test()と動作し、画面にtrueが表示される。
しかし画面に配置したボタンクリックでajaxによる部分ビューの再展開を行うと上記エラーが発生する。
9/30追記
デバッグ不足で見落としがありました。ajaxから処理がControllerに移った際に、部分ビューHTMLを生成するために独自メソッドを呼び出しています。そこで、HttpContextのSessionが無くなって(newされて初期化されて)いました。
少々長いですが、以下部分ビューHTML生成メソッドです。
public static string RenderViewToString(this Controller controller,
                                        string viewName, object viewData) {
    //Create memory writer
    var sb = new StringBuilder();
    var memWriter = new StringWriter(sb);

    //Create fake http context to render the view
    var fakeResponse = new HttpResponse(memWriter);
    var fakeContext = new HttpContext(HttpContext.Current.Request, fakeResponse);
    var fakeControllerContext = new ControllerContext(
        new HttpContextWrapper(fakeContext),
        controller.ControllerContext.RouteData,
        controller.ControllerContext.Controller);

    var oldContext = HttpContext.Current;
    HttpContext.Current = fakeContext;

    //Use HtmlHelper to render partial view to fake context
    var html = new HtmlHelper(new ViewContext(fakeControllerContext,
        new FakeView(), new ViewDataDictionary(), new TempDataDictionary()),
        new ViewPage());
    html.RenderPartial(viewName, viewData);

    //Restore context
    HttpContext.Current = oldContext;    

    //Flush memory and return output
    memWriter.Flush();
    return sb.ToString();
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sho_cs

    2015/09/29 11:20

    ビューのコードを記載してください。

    キャンセル

  • nature_

    2015/09/29 11:50

    sho_cs様 情報が不足しており申し訳ありません。 簡単ではありますが、コード追記致しました。よろしくお願いいたします。

    キャンセル

  • nature_

    2015/09/30 08:40

    エラー箇所が判明しましたので、上記追加させていただきました。 fakeContext(HttpContext型)のSessionがなぜか使えず、、、謎です。

    キャンセル

  • nature_

    2015/09/30 08:45

    また、現在は上記メソッドに var session = HttpContext.Current.Session["session"] as FieldInfo; ・ ・ ・ html.ViewBag.data = session.data; というようにそれまで持っていたセッション情報を直接ViewBagに放り込むと、無事にSession情報が取れるようになりました。しかし、なぜfakeContextのSessionは使えないのか…

    キャンセル

回答 2

check解決した方法

+1

新たな疑問は出てきましたが、今回はSessionからViewBagへの引き渡しでうまく動作しそうです。
そのため自己解決とさせていただきます。
ご回答頂きましてありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/01 09:54

    偶然ですが昨日これと同じバグが出ました、原因不明だったので助かります。

    キャンセル

  • 2015/10/01 13:38

    bigfatrat様
    (同じバグという意味で)なんと嬉しい…
    内容が分かりにくくなってしまいましたが、少しでも参考にしていただければ幸いです。

    キャンセル

0

下記の部分が気になります、具体的にどのような実装をしているのでしょうか?
> 画面に配置したボタンクリックでajaxによる部分ビューの再展開を行うと上記エラーが発生する。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/30 08:35

    bigfatrat
    お世話になります。上記にありますようにajaxの問題ではないようでした。そのためコードは割愛させていただきますが、http://aspnet.keicode.com/basic/jquery-ajax-basics.phpにあります感じで非同期を行っております。(jQueryでajaxでjsonで…)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6880questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • ASP.NET

    510questions

    ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

  • ASP.NET MVC 4

    62questions

    ASP.NET MVC4は、MVCパターンを利用して、高度なテスト機能と保守機能を備えた Web アプリケーションを開発するためのフレームワークです。