2012-01-10 6 views
2

にnullである - 謝罪これはしかし、重複している場合、私はそれがないかなり確信している。..セッションは、私がここに同様の質問を介さかなりの時間を費やしてきたし、私の質問に答えているいずれかを発見していないRouteHandler

I訪問者がフォームを完成させることを目的とするウェブサイトを持っている。私は、より一貫していっぱいになるように異なるタイプのフォームをテストすることに興味があります。私の考えは、各フォームには独自のコントローラーがあり、ユーザーが最初にURLを要求すると、1つのフォームをランダムに選択してRouteDataに関連するコントローラーを設定するカスタムルートハンドラーが選択します。選択されたformidは、フォームの中で無作為に選択されるのではなく、Sessionのサブフォームリクエストに格納されます。

このprobemは、routehandlerのsessionデータにアクセスできないようですが、requestContext.Httpcontext.Sessionは常にnullです。これはパイプラインの時期が早すぎるためですか?もしそうなら、私はこのアプローチをどのように達成できますか?

私が試した最初のコードは次のように見えた:

int FormID = 0; 
string FormName = ""; 
RepositoryManager mgr = new RepositoryManager(); 

if (requestContext.HttpContext.Session["Form_ID"] != null && requestContext.HttpContext.Session["Form_Name"] != null) 
{ 
    int.TryParse(requestContext.HttpContext.Session["Form_ID"].ToString(), out FormID); 
    FormName = requestContext.HttpContext.Session["Form_Name"].ToString(); 
} 

if (FormID == 0) 
{ 
    List<Form> forms = mgr.FormRepository.Get(f => f.FormType.Code == "").ToList(); 
    int rnd = new Random().Next(0, forms.Count - 1); 
    FormID = forms[rnd].ID; 
    FormName = forms[rnd].FormName; 
    requestContext.HttpContext.Session["Form_ID"] = FormID; 
    requestContext.HttpContext.Session["Form_Name"].ToString(); 
} 

requestContext.RouteData.Values["controller"] = FormName; 
return new MvcHandler(requestContext); 

requestContext.HttpContext.Sessionは、私は次のようにカスタムHTTPハンドラをオフに渡すカスタムroutehandlerで試してみましたヌル

であるように、これは常にエラーが発生した:

Routehandler

requestContext.HttpContext.SetSessionStateBehavior(GetSessionStateBehavior(requestContext)); 

IHttpHandlerハンドラ=新しいFormMvcHandler(requestContext); リターンハンドラ。この第二のアプローチでは

FormMVCHandler

public class FormMvcHandler : MvcHandler, IRequiresSessionState 
{ 
    public FormMvcHandler(RequestContext requestContext) 
     : base(requestContext) 
    { 

    } 

    protected override void ProcessRequest(HttpContext httpContext) 
    { 
     //for testing setting form manually - session will be used here as in original routehandler 
     RequestContext.RouteData.Values["controller"] = "1Stage"; 
     base.ProcessRequest(httpContext); 
    } 
} 

コントローラ名を変更しても効果はありません。私はHTTPHandlerのコンストラクタでコントローラ名を変更しようとしましたが、これは効果があります。しかし、RequestContext.HttpContext.Sessionを使ってそこからセッションにアクセスしようとすると、まだnullです。私はProcessRequestでブレークポイントを設定しようとしましたが、決してヒットしません。

編集2

これは今のHttpHandlerにProcessRequest(HttpContext httpContext)BeginProcessRequest(HttpContext httpContext)の両方をオーバーライドすることで動作します - BeginProcessRequestは、フレームワーク(V3)によって呼び出される非同期コントローラを使用していない場合でも、この記事への

+0

カスタムルートハンドラを投稿することができますか、現在の場所ですか? – Tommy

答えて

2

RouteHandlerには、IHttpHandlerを返す関数GetHttpHandlerがあります。そのカスタムHttpHandlerはIRequiresSessionStateを使用し、HttpHandlerのProcessRequest関数でSessionにアクセスできなければなりません。

0

ルック:私はあなたがIRequiresSessionStateインタフェースを使用する必要があると思う

IRequiresSessionState - how do I use it?

+0

これを試してみましたが、違いはありません - IRequiresSessionStateはHttpHandlerではなくRouteHandlerで使用するように設計されています – Macros

+0

RouteHandlerにはIHttpHandlerを返すGetHttpHandler関数があります。そのカスタムHttpHandlerはIRequiresSessionStateを使用し、HttpHandlerのProcessRequest関数でSessionにアクセスできなければなりません。 – Wim

+0

私はこのアプローチを試して、私の質問を更新しました。 – Macros

0

ルータハンドラでセッションを使用するには早すぎます。

あなたはアクションフィルタを使用して、あなたが望むものを達成することができます。

FormPickerAttributeという名前のコントローラFormControllerという名前のコントローラを作成します。 ActionExecutingの属性では、設定されたフォームIDを持つクッキーまたはセッションを確認できます。フォームIDが "Form1"(nullの場合は作成)であるとし、アクションメソッドを "Form1"に変更します。

filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary{ 
        { "controller", "Form" }, 
        { "action", "Form1" }, 
        { "area", ""}, #your area name 
        { "parameter", "parameter value"} #passing any parameter to the action 
       } 
); 

あなたもちょうど正しいものに

{"controller", "FormIdController"} 

更新、各フォームのためのコントローラを作成することができます。

+0

私はこのようなアプローチを試みましたが、私はURLを変更したくありませんでした – Macros

関連する問題