2012-06-20 25 views
0

我的所有控制器在課堂上都有這樣的代碼。ASP.NET MVC3,如何設置可以在Controller和Model中使用的全局變量?

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變量以用於任何控制器和模型。

有人知道,請諮詢我〜

[編輯]

enter image description here

謝謝!

[編輯]

我在HomeController的定義如上述代碼,並試圖調用的userName中的TestController。 但它是空的。 (錯誤現在已經不復存在)

在的TestController,

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

其打印什麼...

我在做什麼錯?

非常感謝您的幫助!

+1

你爲什麼不寫一個處理這個問題的類? –

+0

是的,那也是好方法。但該類不能位於模型中,因爲它會產生錯誤。那麼該類應該放在哪裏,以及如何修復該方法以使模型可以使用該方法? –

回答

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

+0

HttpContext上有錯誤,錯誤消息說'非靜態字段,方法或屬性'System.Web.Mvc.Controller.HttpContext.get'需要對象引用。你知道我能如何解決它嗎?謝謝! ' –

+0

你能發佈你正在執行的代碼嗎? – ivowiblo

+0

我更新了答案,因爲有錯誤。也許這是問題。 – ivowiblo

2

每次使用動作過濾器執行每個動作時,都可以執行該代碼段。你可以找到鐵道部信息here

4

創建控制器的通用基類,並讓所有的實際控制人繼承

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

    protected BaseController() 
    { 
     Member = getUserInfoFromCookie(); 
    } 
} 
public class TestController : BaseController 
{ 
}