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,但我寧願不...
在此先感謝。
感謝這個答案 - 因此除非我想使用的actionresult在當前的filterContext.Controller中,否則沒有辦法做到這一點。 – Carl 2014-09-23 18:11:42
這是一種簡單且摩擦力最小的方式。或者,您可以直接在過濾器內部創建'HttpNotFoundResult'並將其分配,除非您的控制器中還有其他自定義邏輯,您無法/不想將其帶入過濾器。最後,你總是可以模擬MVC框架所做的事情,並自己實例化控制器,但是我會說可能需要重新探索基於過濾器的方法。過濾器應該是小型的,簡單的和自包含的。任何超出少數幾行的代碼都是一種代碼味道,你可能在一個地方做得太多! – Mrchief 2014-09-23 18:51:28