Веб-части в ASP.NET: разница между открытыми и закрытыми веб-частями, хранящимися на странице - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть две веб-зоны на моей странице, как показано ниже:

<asp:WebPartZone ID="Left" WebPartVerbRenderMode="TitleBar" runat="server"  CssClass="PartZone" > 
     <MinimizeVerb  Text="Minimize" Enabled="true" />
     <RestoreVerb  Text="Restore" Enabled="true" />
     <CloseVerb Text="Close" Enabled="true" />
     <ZoneTemplate>
        <REAMS:TotoalEnergyGenerated runat="server" ID="TotEneryGen" />
        <REAMS:NoOfSystemsOnline runat="server" ID="OnlineSys" />
        <REAMS:WeatherInfo Title=" " ID="WeatherInfoExec" runat="server" />
        <REAMS:AssetMap ID="AssetMapExec" runat="server" />
     </ZoneTemplate>
</asp:WebPartZone>

<asp:WebPartZone ID="Bottom" WebPartVerbRenderMode="TitleBar" runat="server"  CssClass="PartZone" > 
     <MinimizeVerb  Text="Minimize" Enabled="true" />
     <RestoreVerb  Text="Restore" Enabled="true" />
     <CloseVerb Text="Close" Enabled="true" />
     <ZoneTemplate>
        <REAMS:ProjectSummary ID="Project" runat="server" />
     </ZoneTemplate>
</asp:WebPartZone>

Как видно, в веб-зоне left есть четыре гаджета (элемента управления), а в веб-зоне bottom - одна.Таким образом, впервые для любого данного пользователя слева отображается четыре, а bottom показывает один гаджет.Теперь предположим, что пользователь закрыл один из 4 гаджетов, и теперь у left есть только три гаджета.В следующий раз он приходит и находит макет страницы в соответствии с его предыдущими модификациями.

У меня есть эти гаджеты как UserControls.Эти usercontrols имеют открытые методы для обращения к базе данных и выполнения некоторой логики и получения данных, и я вызываю эти открытые методы на странице веб-части (а не на самом UC).то есть ucGadget1.LoadData();

вот моя проблема: я хочу загрузить только те гаджеты (UC), которые не закрыты пользователем, т.е. которые видны при загрузке страницы веб-части.Не удается найти разницу между веб-частью, сохраненной на странице, но невидимой, и веб-частью, сохраненной на странице и видимой.Поскольку все свойства этих веб-частей - те, которые написаны на конструкторе. Мне нужны те, которые отображаются во время выполнения (и с помощью таблиц персонализации ASP.NET)

(пожалуйста, рассмотрите gadget = webpart)

Ответы [ 3 ]

1 голос
/ 14 февраля 2012

вот моя проблема: я хочу загружать только те гаджеты, которые не закрыты пользователем, то есть видны, когда страница веб-части грузы. Невозможно найти разницу между веб-частью на странице но не виден, а веб-часть хранится на странице и видна

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

var ID = document.getElementById('ID of the control');

Этот код будет записан в OnBeforeUnLoad Событие


Ссылка

Событие OnBeforeUnload Javascript


Если этот идентификатор возвращает вам память, которая означает, что элемент управления присутствует, в противном случае он скрыт и элемент управления не отображается как HTML.


Теперь вы можете вызывать метод сервера, используя AJAX / JQuery. Этот метод обновит бит видимости элемента управления (высокий / низкий) в базе данных или в любом месте, где вы захотите ....

Надеюсь, это поможет вам ...


Запрос

Закрывая средства управления, установите

  1. Стиль отображения - нет
  2. visibility = false
  3. не загружается элемент управления

0 голосов
/ 11 июля 2013

Вот что я делаю:

на странице 'host' с WebPartManager в ней, переопределяем событие OnPreRender () и создаем переменную Session, уникальную для каждого UC / Wp.Я префикс мой с UI_.

Итак,

protected override void OnPreRender( EventArgs e )
{
    base.OnPreRender( e );

   WebPartZoneCollection Zones = WebPartManager1.Zones;   
   foreach ( WebPartZone z in Zones )
    {

        foreach ( WebPart wp in z.WebParts )
        {
            Control cntrl;

            // get the Control / Webpart
            cntrl = wp.Controls[0];

            // Initialise a Session variable with the ChromeState of the control.
            Session["UI_" + cntrl.ClientID] = wp.ChromeState;

        }
    }
}

Это должно быть сделано с помощью WebPartManager.

Теперь, внутри каждого UserControl / Webpart, его переопределенный OnPreRender можетвыберите ChromeState из уникальной переменной Session, относящейся к идентификатору клиента UserControl.

protected override void OnPreRender( EventArgs e )
{
    base.OnPreRender( e );
    PartChromeState pcs = PartChromeState.Minimized;

    try
    {
        pcs = (PartChromeState)Session["UI_" + this.ClientID];
    }
    catch
    {
        Session["UI_" + this.ClientID] = pcs;
    }

    bool canRefresh = pcs == PartChromeState.Normal;

    if ( canRefresh )
        getData();   // do work only if WP/UC is visible and not 'minimised' or Closed.

}

Причиной попытки / улова является возвращение на страницу с закрытым UC / Wp, сеанса не будетvar устанавливается WebPartManager, поэтому Session будет нулевым.Может быть, есть способ заставить WebPartManager узнать, какие WP / UC были закрыты, но у меня не хватило времени копаться!

В любом случае, в результате любой Webpart / UC был закрыт или свернутне будет попадать в базу данных (или делать что-либо еще), что приведет к гораздо более быстрому «рабочему столу» веб-части.

Я рассматриваю возможность добавления более сложного объекта в переменную Session вместе с его ChromeState (чтобы кэшировать диаграмму)Например, и т. д.), но ключ к этому - настроить состояние конфигурации WebPartManager, поскольку оно само «знает» состояние, в котором находятся UC / Wps!

Надеюсь, это поможет

C

0 голосов
/ 15 февраля 2012

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

 protected override void OnLoadComplete(EventArgs e)
        {
            base.OnLoadComplete(e);

            foreach (WebPart webprt in WebPartManagerDashBoard.WebParts)
            {

                if (!webprt.IsClosed)
                {
                   //Action
                }

            }
        }

Теперь можно реализовать собственную логику вместо // Действие там.Несколько событий WebPartManager также могут быть обработаны в соответствии с использованием.

 WebPartManagerDashBoard.WebPartClosing += new WebPartCancelEventHandler(WebPartManagerDashBoard_WebPartClosing);
...