2011-09-27 28 views
1

我已經自己解決了一些問題 - 我不確定沒有重構代碼的優雅方式。我有其運行的服務器側定時器,並且它需要模擬點擊RadTabStrip.從服務器端觸發OnClientCommand的最佳方法?

客戶端我有以下的方法的一個選項卡:

function OnClientTabSelected(sender, eventArgs) 
{ 
    FixSplitter($find(rightPaneID)); 
} 

FixSplitter依賴於額外的控制,但:

function FixSplitter(sender, eventArgs) 
{ 
    var multiPage = $find(multiPageID); 
    ... 
} 

現在,服務器端的,我有以下幾點:

public void DoTimerCycleTick(object sender, TimerEventArgs eventArgs) 
{ 
    GlobalSettings globalSettings = StateManager.GetStates<GlobalSettings>(); 

    if(globalSettings.CycleEnabled) 
    { 
     if (!Equals(DateTime.Now.CompareTo(globalSettings.TimeLastCycled.AddMinutes(globalSettings.CycleInterval)), -1)) //CompareTo returns -1 when time is earlier than. 
     { 
      int nextIndex = SelectedIndex + 1; 

      if(nextIndex == Tabs.Count) 
      { 
       nextIndex = 0; 
      } 

      SelectedIndex = nextIndex; 
      LayoutManager.Instance.MultiPage.SelectedIndex = nextIndex; 
      LayoutManager.Instance.MultiPageUpdatePanel.Update(); 
      //ScriptManager.RegisterClientScriptBlock(Page, Page.GetType(), "KEY", "OnClientTabSelected();", true); 
      globalSettings.TimeLastCycled = DateTime.Now; 
     } 
    } 

    StateManager.SaveGlobalSettings(globalSettings); 
} 

這段代碼的相關位是我設置索引的地方。顯然,這不會觸發OnClientTabSelected方法。然而,我需要運行FixSplitter方法。

所以,我認爲這個驚喜的快速解決方案是註冊一個客戶端腳本。事實上,如果不是依賴多頁面,這可能就足夠了。由於我的多頁包裝在當前正在更新的UpdatePanel中,因此無法使用$find(multiPageID). $ find(multiPageID)返回null,因爲$find(rightPaneID)返回期望的對象 - 兩個聲明都是相同的,並且代碼在所有其他情況下都能順利工作。我有信心說罪魁禍首是UpdatePanel。

除了創建一個與OnClientTabSelected完全相同的新方法外,我還有其他選擇,除了強制MultiPageUpdatePanel在執行後回發 - 而不是在UpdatePanel服務器端調用Update嗎?

我認識到這個問題存在更深層的問題,但它是未完成的代碼,無法再分解幾個星期。

編輯:經過一番工作,這裏是我提出的解決方案。接受批評,我不是這方面的專家。 :)

/// <summary> 
/// Performs one tick of a timer on the chart. 
/// Ticks based on time for testability and to prevent 
/// weird cases when skipping the clock time forward. 
/// </summary> 
public void DoTimerCycleTick(object sender, TimerEventArgs eventArgs) 
{ 
    GlobalSettings globalSettings = StateManager.GetStates<GlobalSettings>(); 

    if(globalSettings.CycleEnabled) 
    { 
     if (!Equals(DateTime.Now.CompareTo(globalSettings.TimeLastCycled.AddMinutes(globalSettings.CycleInterval)), -1)) //CompareTo returns -1 when time is earlier than. 
     { 
      int oldIndex = SelectedIndex; 
      int newIndex = (oldIndex + 1) != Tabs.Count ? (oldIndex + 1) : 0; 

      SelectedIndex = newIndex; 
      LayoutManager.Instance.MultiPage.SelectedIndex = newIndex; 
      //LayoutManager.Instance.MultiPageUpdatePanel.Update(); 
      ScriptManager.RegisterStartupScript(Page, Page.GetType(), "KEY", string.Format("OnServerTabSelected({0});", newIndex), true); 
      globalSettings.TimeLastCycled = DateTime.Now; 
     } 
    } 

    StateManager.SaveGlobalSettings(globalSettings); 
} 

var showLoadingPanel = true; 

function OnServerTabSelected(newIndex) { 
    var oldID = $find(multiPageID).get_selectedPageView().get_id(); 
    var newID = $find(multiPageID).get_pageViews().getPageView(newIndex).get_id(); 

    if ($telerik.$("#" + oldID).is(":visible")) { 
     $telerik.$("#" + oldID).fadeOut(1000, function() { 
      $telerik.$("#" + newID).fadeIn(1000, function() { 
       showLoadingPanel = true; 
       $find(multiPageID).set_selectedIndex(newIndex); 
      }); 
     }); 

     showLoadingPanel = false; 
     FixSplitter($find(rightPaneID)); 
     return; 
    } 
} 

回答

1

你就不能超載FixSplitter方法,即需要這兩個paramters,確實查找,然後調用其他方法與所有3個參數?這樣,您可以隨時在需要時覆蓋multiPage值;

function FixSplitter(sender, eventArgs) 
{ 
    var multiPage = $find(multiPageID); 
    FixSplitter(sender, multiPage, eventArgs); 
} 

function FixSplitter(sender, multiPage, eventArgs) 
{ 
    ... 
} 

如果因某種原因無法重載,可以使用DoFixSplitter之類的替代符號。

相關問題