сессии asp.net наблюдения


Это полезно или есть очевидный другим способом?

Контекст решения задачи клокотать событиями на сайте ASP.NET построенный с пользовательские и вложенные элементы управления пользователя. Я нашел себя писать кучу событий.

Таким образом, вместо событий, я использую технику, чтобы любой клиент смотреть произвольное значение сессии.

Общий контекст класса для страниц и пользовательских элементов управления. Обновление сессии значения пройдите здесь, а также регистрация на сессии изменения стоимости.

public class WebSiteContext
{
    private WebSitePage _webSitePage;

    public WebSiteContext(WebSitePage webSitePage)
    {
        _webSitePage = webSitePage;
    }

    internal void SetSessionValue<T>(string key, T value)
    {
        object current = _webSitePage.Session[key];
        if (current != null && current.Equals(value)) return;
        _webSitePage.Session[key] = value;
        if (_dic.ContainsKey(key)) _dic[key](value);
    }

    internal Dictionary<string, Action<object>> _dic = new Dictionary<string, Action<object>>();

    internal void WhenSessionValueChanges(string key, Action<object> action)
    {
        _dic.Add(key, action);
    }
}

Базовый конструктор создает экземпляр контекста.

public class WebSitePage : System.Web.UI.Page
{
    public WebSitePage()
    {
        this.WebSiteContext = new WebSiteContext(this);
    }

    public WebSiteContext WebSiteContext { get; set; }
}

Базовый пользовательский элемент управления свойство, чтобы получить контекст от родительской страницы.

public class WebSiteUserControl : System.Web.UI.UserControl
{
    public WebSiteContext WebContext { 
       get { 
          return (this.Page as WebSitePage).WebSiteContext; 
       } 
    }
}

Пользовательский элемент управления изменяет значение сессии.

public partial class AdvertiserSelector : WebSiteUserControl
{
    protected void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
    {
       this.WebContext.SetSessionValue(
          SessionKeys.current_advertiser_id,
          (sender as ComboBox).SelectedValue);
    }
}

Теперь в моем веб-код страницы, вместо того, чтобы подписаться на событие, действие, зарегистрированных на сессии изменения стоимости.

namespace WebApplication1.Screens.CampaignSpend
{
    public partial class Default : WebSitePage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            this.WebSiteContext.WhenSessionValueChanges(SessionKeys.current_advertiser_id, c => GridView1.DataBind());
        }
    }
}


1291
2
задан 21 октября 2011 в 01:10 Источник Поделиться
Комментарии
1 ответ

То, что вы реализовали-это просто событие изменить значение сессии, но, как вы используете делегат, а не только один элемент управления может одновременно зарегистрироваться на мероприятие.

Использовать событие, вместо делегата, и у вас есть регулярные события change для переменных сессии.

1
ответ дан 21 октября 2011 в 06:10 Источник Поделиться