我已经自己解决了一些问题 - 我不确定没有重构代码的优雅方式。我有其运行的服务器侧定时器,并且它需要模拟点击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;
}
}