У меня есть атрибут фильтра, зарегистрированный глобально в моем приложении 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, но я бы предпочел не ...
Заранее спасибо.
Спасибо за этот ответ - поэтому нет способа сделать это, если actionresult, который я хочу использовать, находится в текущем filterContext.Controller? – Carl
Это один из способов, который прост и имеет минимальное трение. В качестве альтернативы вы можете напрямую создать «HttpNotFoundResult» внутри фильтра и назначить его, если в вашем контроллере нет какой-либо другой пользовательской логики, которую вы не можете/не хотите вводить в фильтр. Наконец, вы всегда можете эмулировать структуру MVC и создавать экземпляр контроллера самостоятельно, но тогда я бы сказал, что, возможно, нужно пересмотреть подход, основанный на фильтрах. Фильтры должны быть маленькими, простыми и автономными. Любой код, который выходит за рамки нескольких строк, - это запах кода, который вы можете делать слишком много в одном месте! – Mrchief