2012-03-04 70 views
0

嗨,檢查MVC中每個請求上是否存在用戶?

我需要檢查,如果登錄的用戶做仍然存在於數據庫中,如果不是我需要重定向到另一個網頁。

財產以後這樣的:

if (AccountHandler.Instance.UserIdentityName.Length > 0) 
    { 
     AccountModel accountModel = new AccountModel(); 

     if (!accountModel.AccountExists(AccountHandler.Instance.UserIdentityName)) 
     { 
      FormsAuthentication.SignOut(); 
      HttpContext.Current.Items[HttpContextKey.UserContext.ToString()] = null; 
      return Redirect(Request.UrlReferrer.PathAndQuery); 
     } 
    } 

如何做到這一點的ASP.NET MVC?我已經嘗試過Global.asax Application_BeginRequest,但是這會針對每個請求觸發,所以不應該在這裏放置重定向。

回答

2

我會建議全球行動過濾器將是最合適的方式來做到這一點。另一種方法是使用在OnActionExecuting中實現的基礎控制器。

創建一個派生自ActionFilterAttribute的類。將其添加到global.asax.cs中的全局過濾器。讓它重寫OnActionExecuting並在那裏實現代碼。

public RequireValidUserAttribute: ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (AccountHandler.Instance.UserIdentityName.Length > 0) 
     { 
      AccountModel accountModel = new AccountModel(); 

      if (!accountModel.AccountExists(AccountHandler.Instance.UserIdentityName)) 
      { 
       FormsAuthentication.SignOut(); 
       filterContext.HttpContext.Items[HttpContextKey.UserContext.ToString()] = null; 
       filterContext.Result = new RedirectResult { Url = Request.UrlReferrer.PathAndQuery }; 
      } 
     } 
    } 
} 
+0

這是可能的MVC2,如果是這樣,如何? – Banshee 2012-03-04 15:49:37

+0

我不認爲全局過濾器在MVC2中可用。我想,你必須去那裏的基地控制器路線。如果可以的話,值得升級到MVC3。請注意,它基本上是在不同位置實現的相同代碼,並且您必須記住從基本控制器派生並調用基本行爲(如果在子控制器中覆蓋該方法)。 – tvanfosson 2012-03-04 15:55:20