0

私のコントローラーはすべて、クラスの一番上にこのコードがあります。

public class TestController : Controller
{
//
// GET: /Reports/

string userName;
string uid;
string accountType;
int companyCode;

protected override void Initialize(RequestContext requestContext)
{
    base.Initialize(requestContext);

    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Request.Cookies[cookieName];


    if (authCookie != null)
    {
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    string userData = authTicket.UserData;

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    var userInfo = serializer.Deserialize<MemberModel>(userData);

    userName = userInfo.firstName + " " + userInfo.lastName;
    uid = userInfo.uid;
    accountType = userInfo.accountType;
    companyCode = userInfo.companyCode;
    }
}

なぜなら、すべてのコントローラーは Cookie にあるユーザー情報を持っている必要があるからです。

これは、すべてのコントローラーでそのコードを記述する正しい方法ではないと思います。

また、自分のモデルでそのメソッドを使用することはできません。

base.Initialize(requestContext); <= 'object' does not contain a definition for 'Initialize'

そのため、そのメソッドを GLOBAL 変数として設定して、コントローラーとモデルで使用する方法を知りたいです。

どなたかご存知の方アドバイスお願いします~

[編集]

ここに画像の説明を入力

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

[編集]

HomeController で上記のコードのように定義し、testController で userName を呼び出そうとします。しかし、それは空です。(エラーはなくなりました)

テストコントローラーでは、

[HttpGet]
public void test()
{
    Response.Write(MemberModelProvider.UserName);
    Response.Write(System.Web.HttpContext.Current.Items["UserName"]);
}

それは何も印刷しません...

私は何を間違っていますか?

あなたの助けにとても感謝しています!

4

3 に答える 3

4

コントローラーの共通の基本クラスを作成し、実際のすべてのコントローラーがそれを継承するようにします

public abstract class BaseController : Controller
{
    protected readonly MemberModel Member;

    protected BaseController()
    {
        Member = getUserInfoFromCookie();
    }
}
public class TestController : BaseController
{
}
于 2012-06-20T05:48:58.417 に答える
2

アクション フィルターを使用して、各アクションが実行されるたびにそのコードを実行できます。あなたはここでモル情報を見つけることができます

于 2012-06-20T03:23:30.390 に答える
1

その情報を HttpContext.Items に入れることができます。このコレクションはリクエストの間存続するため、異なるリクエストが同じコードにアクセスしても問題はありません。

public abstract class AuthenticatedController : Controller
{

  protected override void Initialize(RequestContext requestContext)
  {
    base.Initialize(requestContext);

    string cookieName = FormsAuthentication.FormsCookieName;
    HttpCookie authCookie = Request.Cookies[cookieName];


    if (authCookie != null)
    {
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    string userData = authTicket.UserData;

    JavaScriptSerializer serializer = new JavaScriptSerializer();
    var userInfo = serializer.Deserialize<MemberModel>(userData);
    MemberModelProvider.Current = userInfo;
    }
  }
}

public class HomeController :  AuthenticatedController {

    //Your actions here...
}

public class TestController :  AuthenticatedController {

    //Your actions here...
}

public class MemberModelProvider {
    public static MemberModel Current {
        get { return (MemberModel)HttpContext.Current.Items["CurrentMemberModel"];}
        set { HttpContext.Current.Items["CurrentMemberModel"] = value; }
    }
}

その後、それを使用する必要があるときはいつでも、 を呼び出すだけMemberModelProvider.Currentです。

于 2012-06-20T05:59:27.577 に答える