Как предотвратить код пользовательских элементов управления в асинхронных обратных передачах? - PullRequest
0 голосов
/ 21 июля 2011

У меня есть страница aspx, которая содержит десятки пользовательских элементов управления, у меня есть панель обновления Ajax asp.net, которая обновляет небольшую область страницы, на которой другие элементы управления живут на странице. (Пользовательские элементы управления находятся за пределами панели обновления и панель обновления имеет UpdateMode = "Conditional"). Есть ли способ программно предотвратить запуск кода за пользовательскими элементами управления, так как это серьезно ухудшает производительность / время загрузки страницы. У меня есть проверка IsAsyncPostback для диспетчера сценариев, чтобы предотвратить ненужные вызовы DAL. Есть ли способ предотвратить запуск пользовательского кода управления в соответствии со следующими условиями,

  • не может коснуться пользовательского управляющего кода, файла страницы ascx и т. Д.
  • не может использовать кеширование
  • Любые изменения могут быть внесены в страницу aspx и ее код, на который я ссылаюсь выше.
  • Невозможно интегрировать каркасы Jquery или javascript (хотелось бы, чтобы было слишком поздно, чтобы сделать это сейчас.

Ответы [ 3 ]

0 голосов
/ 21 июля 2011

Вы можете использовать Page.LoadControl для их условной загрузки. На практике это большая боль в шее и добавляет много сложности и без того сложной архитектуре.

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

0 голосов
/ 21 июля 2011

вот код, который я использую для устранения неиспользуемого рендера во многих пользовательских элементах управления, находящихся внутри панели обновления

<asp:UpdatePanel ID="updPnlUserAct" runat="server" RenderMode="Block" UpdateMode="Conditional" >
<ContentTemplate>   

в коде

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsUpdatePanelInRendering(Page, updPnlUserAct))
        return ;

и это код, который делает проверку

public static bool IsUpdatePanelInRendering(Page page, UpdatePanel panel)
{
    Debug.Assert(HttpContext.Current != null, "Where are you called ? HttpContext.Current is null ");
    Debug.Assert(HttpContext.Current.Request != null, "Where are you called HttpContext.Current.Request is null ");

    // if not post back, let it render
    if (false == page.IsPostBack)
    { 
        return true; 
    }
    else
    {
        try
        {
            // or else check if need to be update
            ScriptManager sm = ScriptManager.GetCurrent(page);

            if (sm != null  && sm.IsInAsyncPostBack)
            {
                Debug.Assert(HttpContext.Current.Request.Form != null, "Why forms are null ?");

                string smFormValue = HttpContext.Current.Request.Form[sm.UniqueID];

                if (!string.IsNullOrEmpty(smFormValue))
                {
                    string[] uIDs = smFormValue.Split("|".ToCharArray());
                    if (uIDs.Length == 2)
                    {
                        if (!uIDs[0].Equals(panel.UniqueID, StringComparison.InvariantCultureIgnoreCase))
                        {
                            return false;
                        }
                    }
                }
            }
        }
        catch (Exception x)
        {
            Debug.Fail("Ops, what we lost here ?");
        }

        return true;
    }
}
0 голосов
/ 21 июля 2011

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

С учетом вышесказанного, методы жизненного цикла страницы для UserControl должны запускаться для их повторной визуализации. Методология UpdatePanel - это не то, что вы ожидаете от решения "AJAX", потому что технически, когда UpdatePanel обновляет всю вашу страницу, перерисовывается, но возвращаются и перерисовываются только те части, которые вы просили изменить. UI.

Что вы можете сделать, это проверить, находится ли вы в середине обратной передачи AJAX через:

ScriptManager.IsInAsyncPostBack

Тогда вы можете запретить запуск кода в методах вашего UserControl, если это свойство оценивается как true.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...