2014-09-23 64 views
0

我在我的MVC應用程序中全局註冊了一個過濾器屬性,該過濾器屬性檢查基於url的特定配置。我計劃在IIS中使用一個catchall,因此對於不匹配的域,我想先顯示一個404頁面而不重定向。從請求過濾器返回特定操作結果

到目前爲止,我有:

public class GetWebsiteConfiguration : FilterAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     string siteNoteFoundName = "SiteNotFound"; 
     string controllerName = "Error"; 
     if (filterContext.ActionDescriptor.ActionName != siteNoteFoundName && filterContext.ActionDescriptor.ControllerDescriptor.ControllerName != controllerName) 
     { 
      //Code removed for brevity 
      IWebsiteService websiteSvc = new WebsiteService(); 
      Website website = websiteSvc.GetByDomain(HttpContext.Current.Request.Url.Host); 
      if (website != null) 
      { 
       //load up the website's config - e.g. asset code etc. 
      } 
      else 
      { 
       //this is where I'm stuck - I want to return my action result SiteNotFound in my     
       //controller Error as the filterContext.Result. 
       //filterContext.Result = ?? 
      } 
     } 
    } 
} 

但是,我想不出如何設置filterContext.Result來。我嘗試了controller.Execute(),但是它提供了請求的原始頁面以及未找到的頁面。我知道我可以做一個redirectResult,但我寧願不...

在此先感謝。

回答

0

一種方法是創建一個基本控制器並在那裏移動SiteNotFound動作。

public class BaseController : Controller { 
    protected HttpNotFoundResult SiteNotFound(string statusDescription = null) 
     { 
      return new HttpNotFoundResult(statusDescription); 
     } 
} 

然後你就可以將結果簡單地指定爲:

filterContext.Result = filterContext.Controller.SiteNotFound(<description>); 

您可能還需要設置這個(避免IIS到捕獲這些錯誤)

controllerContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
+0

感謝這個答案 - 因此除非我想使用的actionresult在當前的filterContext.Controller中,否則沒有辦法做到這一點。 – Carl 2014-09-23 18:11:42

+0

這是一種簡單且摩擦力最小的方式。或者,您可以直接在過濾器內部創​​建'HttpNotFoundResult'並將其分配,除非您的控制器中還有其他自定義邏輯,您無法/不想將其帶入過濾器。最後,你總是可以模擬MVC框架所做的事情,並自己實例化控制器,但是我會說可能需要重新探索基於過濾器的方法。過濾器應該是小型的,簡單的和自包含的。任何超出少數幾行的代碼都是一種代碼味道,你可能在一個地方做得太多! – Mrchief 2014-09-23 18:51:28

相關問題