У меня есть два 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);
}
}
Это происходит потому, что конструктор атрибута вызывается только один раз и до тех пор, пока приложение запускает его. В основном это синглтон. Вот почему он сохраняет то же значение. Расскажите, что именно вы пытаетесь достичь с помощью переменной _something. –
А, это интересно знать! Отредактировано с дополнительной информацией. дайте мне знать, если это имеет смысл. Благодаря! – gdubs
Спасибо за дополнительное объяснение, но я боюсь, что до сих пор не понимаю. Однако, что бы вы ни пытались сделать, я не думаю, что это хороший путь. Проблема в том, что у вас нет гарантии, что приложение будет находиться между запросами (поэтому не гарантируется сохранение значения _something). В вашем случае решение, вероятно, должно состоять в том, чтобы использовать что-то, предназначенное для хранения информации между запросами, например, сеанс. –