2010-02-23 6 views
3

Вкратце: Может ли кто-нибудь узнать путь от базового контроллера, чтобы получить список действийФильтры, применяемые к текущему действию?Получение списка фильтров действий от базового контроллера

The Long: Я использую ASP.NET MVC 1.0 framework. У меня есть actionFilter «RequireSSL», который я воссоздал для проверки, однако, если кто-то покидает проверку и возвращается в магазин, я бы хотел отправить их обратно в небезопасную версию сайта.

Это было бы полезно в базовом контроллере (я использую настраиваемый базовый контроллер, который наследует от контроллера по умолчанию), чтобы узнать, какие действияФильтры применяются к текущему действию.

Я мог бы включить это в global.asax.cs Я предполагаю, что любое руководство здесь будет оценено.

Благодаря

ответ

3

Вы можете создать ActionFilter и осуществить OnActionExecuting. Из этого атрибута вы можете перенаправить их.

public sealed class MyRedirectAttributeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (!filterContext.ActionDescriptor.IsDefined(typeof(RequireSSLAttribute), true)) 
     { 
      filterContext.HttpContext.Response.Redirect("~/Controller/Action"); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
}true 
+0

Разве я не должен добавить этот фильтр к каждому действию? Текущая настройка, у меня есть actionFilter, называемый «RequireSSL», который отлично работает с пересылкой браузера на SSL, если это действие имеет этот фильтр, но для всех действий, отличных от ssl, я не хочу требовать применения другого фильтра .. По сути дела, чтобы каждое действие требовало либо не-ssl, либо ssl-фильтр, было бы плохой способ, я думаю .. – Ethode

+0

Это помещается на BaseController не каждое действие. Он проверяет действие. Мы сделали что-то подобное. RedirectAttribute выполняет ветвление на основе того, какие атрибуты он находит в действии. Атрибут действия не является ActionFilter. – Thad

+0

Я добавил это к методу initialize в моем базовом контроллере, но он, похоже, не работает. Который я нахожу странным. Есть ли другое место, которое я должен положить? – Ethode

1

Ну, вот что я завелся с ..

public sealed class HandleConnectionSecurityAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     HttpRequestBase req = filterContext.HttpContext.Request; 
     HttpResponseBase res = filterContext.HttpContext.Response; 

     if (!filterContext.ActionDescriptor.IsDefined(typeof(RequiresSSL), true) && HttpContext.Current.Request.IsSecureConnection) 
     { 
      var builder = new UriBuilder(req.Url) 
      { 
       Scheme = Uri.UriSchemeHttp, 
       Port = 80 
      }; 
      res.Redirect(builder.Uri.ToString()); 
     } 

     base.OnActionExecuting(filterContext); 
    } 
} 

Затем я добавил атрибут действия в SuperController я создал.

[HandleConnectionSecurity]
общественного класса SuperController: Контроллер

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