从服务器端触发OnClientCommand的最佳方式

本文关键字:最佳 方式 OnClientCommand 服务器端 | 更新日期: 2023-09-27 18:10:04

我遇到了一个问题——我不确定在不重构代码的情况下是否有一个优雅的解决办法。我有一个正在运行的服务器端计时器它需要模拟点击RadTabStrip.

的选项卡我有以下方法:
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方法。

所以,我认为这个惊喜的快速修复将是注册一个客户端脚本。实际上,如果不是因为对multiPage的依赖,这可能就足够了。因为我的MultiPage被包装在一个UpdatePanel,目前正在更新-它不能使用$find(multiPageID). $find(multiPageID)返回null,因为$find(rightPaneID)返回预期的对象-两个声明是相同的,代码在所有其他情况下顺利工作。我可以自信地说,罪魁祸首是UpdatePanel。

我有选项,而不是创建一个新的方法做同样的事情作为OnClientTabSelected除了强制MultiPageUpdatePanel回发后执行-而不是调用UpdatePanel服务器端的更新?

我知道这其中有更深层次的问题,但这是几周内无法分解的未完成代码。

编辑:经过一些工作,这是我提出的解决方案。恕我直言,我不是这方面的专家。:)
/// <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;
    }
}

从服务器端触发OnClientCommand的最佳方式

你不能只是重载FixSplitter方法,一个接受这两个参数,查找,然后调用所有3个参数的另一个方法?这样,当您可能需要multiPage值时,您总是可以覆盖它;

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

如果你因为某些原因不能重载,你可以使用像DoFixSplitter这样的替代符号