2009-06-17 73 views
4

我正在使用FormsAuthenticationTicket的UserData屬性來存儲某些用戶特定的信息。我有一個HelperClass將這個UserData反序列化爲一個用於強類型訪問的自定義對象。我有我的控制器設置如下訪問控制器構造函數中的Request.Cookies

public class SomeController : Controller 
{ 
    private CookieData _cookieData; 

    public SomeController() 
    { 
     _service = new ForderungsStellerService(new ModelStateWrapper(this.ModelState)); 
     HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
     _cookieData= GetSessionData.FromCookie(ticket); 
    } 
} 

問題似乎是,在控制器構建時請求爲空。從ActionMethod訪問Request.Cookies時,該代碼片段正在工作。

我想有_cookieData對象在DRY原因的構造函數中填充。

有沒有人對這個問題有暗示?

問候......

回答

6

我會創造一個瞭解CookieData以及如何把它弄出來Request對象的ModelBinder的。我擔心創建構造函數所必需的單元測試創​​建代碼。如果您使用Model Binder將它作爲控制器的參數,則可以避免該測試開銷。

public class SomeController : Controller 
{ 
    // only need to pass in the data object for unit testing. 
    // ModelBinder takes care of DRY 
    public ActionResult Index(CookieData cookieData) 
    { 
    } 
} 

爲什麼它在構造函數中不起作用的答案是Controller在此時尚未用ControllerContext進行初始化。

public HttpContextBase HttpContext { 
    get { 
    return ControllerContext == null 
     ? null 
     : ControllerContext.HttpContext; 
    } 
} 

如果你真的做它在構造函數中(不要),然後使用HttpContext.Request,而不是包裝。但通過這樣做,您將使您的代碼無法測試,並且您的對齊將下降3點。

+0

使用ModelBinder是一個聰明的主意。感謝它。解決了我的問題... – Gordon 2009-06-17 08:25:14

0

它很好乾,但在ASP.NET MVC的情況下,它通常意味着使用自定義過濾器屬性或像talljoe顯示模型活頁夾。

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpCookie cookie = filterContext.HttpContext.Request.Cookies[FormsAuthentication.FormsCookieName]; 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 
     filterContext.ActionParameters["CookieData"] = GetSessionData.FromCookie(ticket); 


     base.OnActionExecuting(filterContext); 
    } 
5

覆蓋Controller.Initialize()調用base.Initialize後

protected override void Initialize(RequestContext requestContext) { 
    base.Initialize(requestContext); 
    // do further initialization here 
} 

屬性,如請求等將提供給你()。

+0

也是一個正確的解決方案。會工作,但它使單位測試更加困難,因爲它應該是。 – Gordon 2009-06-17 10:13:49