我已經自己解決了一些問題 - 我不確定沒有重構代碼的優雅方式。我有其運行的服務器側定時器,並且它需要模擬點擊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;
}
}