2014-09-23 3 views
0

У меня есть атрибут фильтра, зарегистрированный глобально в моем приложении MVC, который проверяет конкретную конфигурацию на основе URL-адреса. Я планирую использовать catch в IIS, поэтому для доменов, которые не совпадают, я хочу отобразить страницу 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

+0

Это один из способов, который прост и имеет минимальное трение. В качестве альтернативы вы можете напрямую создать «HttpNotFoundResult» внутри фильтра и назначить его, если в вашем контроллере нет какой-либо другой пользовательской логики, которую вы не можете/не хотите вводить в фильтр. Наконец, вы всегда можете эмулировать структуру MVC и создавать экземпляр контроллера самостоятельно, но тогда я бы сказал, что, возможно, нужно пересмотреть подход, основанный на фильтрах. Фильтры должны быть маленькими, простыми и автономными. Любой код, который выходит за рамки нескольких строк, - это запах кода, который вы можете делать слишком много в одном месте! – Mrchief

 Смежные вопросы

  • Нет связанных вопросов^_^