1

すべてのメソッドが Cookie を使用できるようにするために、コンストラクター メソッドでクラス変数として Cookie 値を定義したいと考えています。

しかし、次のようなエラーメッセージが表示されました。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

 public class OrdersController : Controller
{   
    string userData;

    public orderConroller(){
       string cookieName = FormsAuthentication.FormsCookieName;
           HttpCookie authCookie = Request.Cookies[cookieName];
       FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
           userData = authTicket.UserData;
    }

    public void a(){
      //I need Cookie
    }
    public void b(){
      //I need Cookie
    }
    public void c(){
      //I need Cookie
    }
    public void d(){
      //I need Cookie
    }
}

どうすればこの問題を解決できますか? @.@

ありがとうございました!

4

3 に答える 3

6

まだ初期化されていないため、コントローラーコンストラクター内でHttpContext(この場合、オブジェクトにアクセスしようとしている) を使用することはできません。Requestアクセスできる最も早い方法は、Initializeオーバーライドできる方法です。

そう:

public class OrdersController : Controller
{   
    private string userData;

    protected override void Initialize(RequestContext requestContext) 
    {
        base.Initialize(requestContext);
        var request = requestContext.HttpContext.Request;
        string cookieName = FormsAuthentication.FormsCookieName;
        HttpCookie authCookie = request.Cookies[cookieName];
        FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        userData = authTicket.UserData;
    }

    public void a() {
      //I need Cookie
    }
    public void b() {
      //I need Cookie
    }
    public void c() {
      //I need Cookie
    }
    public void d() {
      //I need Cookie
    }
}
于 2012-06-10T20:29:54.433 に答える
0

ユーザーデータを怠惰な方法で利用できるようにすることができます。

public class OrdersController : Controller
{   
    private string userData;
    private string UserData {  
        get { 
            if(userData == null) {
                var request = requestContext.HttpContext.Request;
                string cookieName = FormsAuthentication.FormsCookieName;
                HttpCookie authCookie = request.Cookies[cookieName];
                FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
                userData = authTicket.UserData;
             }
             return userData;
         }
     }
...
}

UserData次に、アクションでプロパティを呼び出すだけです。このように、リクエストでそのコードを実行することはありませんが、ユーザーデータを必要とするコードでのみ実行します(復号化することを考えると、必要がない場合は、すべてのリクエストでそれを実行しないようにすることをお勧めします)。

それが役に立てば幸い。

于 2012-06-10T22:44:30.177 に答える
0

Cookie の必要性は認証に関するものだと思います。認証については、カスタム認証フィルターを使用するのが最善の方法です。フィルタは、必要なすべての情報を使用して User オブジェクトを初期化できます。このコードをコンストラクター内に置くよりもはるかにエレガントです。

于 2012-06-10T22:28:35.890 に答える