0

У меня есть два actionfilterattributes и действиеНаследуется пользовательские Actionfilterattribute сохраняет значение свойства на втором вызове действия

public class BaseAttribute : ActionFilterAttribute{ 

    protected bool _something 
    public BaseAttribute(bool something){ 
     _something = something 
    } 
    public override void OnActionExecuting(ActionExecutingContext filterContext){ 
     _something = true; 
     Console.WriteLine(_something); 
    } 
} 


public class ChildAttribute : BaseAttribute{ 
    public ChildAttribute(bool somethingChild): base(somethingChild){ 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext){ 
     Console.WriteLine(_something); 

     if(!_something) 
      base.OnActionExecuting(filterContext); 
    } 
} 

[ChildAttribute (false)] 
public ActionResult SomeMethodCalledByAngular(){ 
    ...... 
} 

, когда я называю SomeMethodCalledByAngular в первый раз, _something переменной обновляется, как ожидалось ... это становится правдой, но без обновления страницы, и я снова нахожусь в actionresult, значение по-прежнему истинно. Это точно? Как я могу убедиться, что он сбрасывается на исходное значение, которое я передал, когда я его украсил на Actionresult или false?

EDIT: Поэтому я в основном пытаюсь обновить эту переменную в зависимости от поля таблицы, которое захватывается из базы данных. Если, например, пользователь не обновил страницу, но значение этого поля изменилось, я хочу обновить переменную. Этот actionfilter становится как фильтр безопасности для запросов, так как я использую действия, подобные API, по крайней мере для определенных контроллеров.

EDIT2:

Просто для расширения. Скажем, я перехожу на страницу с помощью кнопки, и эта кнопка может выполнять почтовый запрос на действие. Но это действие можно получить, только если вы ПОДПИСЫВАЕТСЯ. Давайте рассмотрим эту модель

public class User{ 
    public int Id {get;set;} 
    public DateTime SubscribedFrom {get;set;} 
    public DateTime SubscribedTo {get;set;} 
} 

В принципе, каждый actionfilter сработал, мне нужно, чтобы проверить, если пользователь по-прежнему в сроки подписки. Если нет, действие не должно быть доступно, поэтому возвращается ошибка.

Так что я буду иметь

BaseAttribute общественный класс: ActionFilterAttribute {

protected bool _subscribed 
    public BaseAttribute(bool subscribed){ 
     _subscribed= subscribed 
    } 
    public override void OnActionExecuting(ActionExecutingContext filterContext){ 
     User user = <get the user details> 
     if(user.SubscribedFrom < DateTime.Now && user.SubscribedTo > DateTime.Now) 
     _subscribed = true; 
     Console.WriteLine(_something); 
    } 
} 


public class ChildAttribute : BaseAttribute{ 
    public ChildAttribute(bool somethingChild): base(somethingChild){ 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext){ 

     // do a check on another layer of security and see if there's an override. if there is not, _subscribed remains false, then proceeds to the base filter to validate the user subscription 

     if(!_subscribed) 
      base.OnActionExecuting(filterContext); 
    } 
} 
+0

Это происходит потому, что конструктор атрибута вызывается только один раз и до тех пор, пока приложение запускает его. В основном это синглтон. Вот почему он сохраняет то же значение. Расскажите, что именно вы пытаетесь достичь с помощью переменной _something. –

+0

А, это интересно знать! Отредактировано с дополнительной информацией. дайте мне знать, если это имеет смысл. Благодаря! – gdubs

+0

Спасибо за дополнительное объяснение, но я боюсь, что до сих пор не понимаю. Однако, что бы вы ни пытались сделать, я не думаю, что это хороший путь. Проблема в том, что у вас нет гарантии, что приложение будет находиться между запросами (поэтому не гарантируется сохранение значения _something). В вашем случае решение, вероятно, должно состоять в том, чтобы использовать что-то, предназначенное для хранения информации между запросами, например, сеанс. –

ответ

0

Хорошо, теперь я получаю это :) Тем не менее, на мой взгляд, это не чистый дизайн. Проблема заключается в том, что у вас есть эта переменная, которая используется обоими классами, и эта логика немного трудно понять. Но я не думаю, что вам нужна эта переменная для того, что вы делаете. Я немного переработал это. Посмотрите, работает ли это для вас:

public class BaseValidationCheckAttribute : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      User user = < get the user details > 
      if (IsSubscriptionValid(user)) 
      { 
       DoThings(); 
      } 
     } 

     protected bool IsSubscriptionValid(User user) 
     { 
      return (user.SubscribedFrom < DateTime.Now && user.SubscribedTo > DateTime.Now); 
     } 

     protected void DoThings() 
     { 
      Console.WriteLine("doing something..."); 
     } 
    } 

    public class ValidationWithOverrideCheckAttribute : BaseValidationCheckAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      User user = < get the user details > 
      //first checking the override and if true we don't even care about the base validation, if false, then we also check the subscription validation 
      if (IsSubscriptionOverride(user) || IsSubscriptionValid(user)) 
      { 
       DoThings(); 
      } 
     } 

     private bool IsSubscriptionOverride(User user) 
     { 
      //here check whatever to see if we should override the base subscription validation 
      return false; 
     } 
    }