首页 文章

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

提问于
浏览
1

我've worked myself into a bit of a problem -- I'我不确定没有重组我的代码有一个优雅的出路 . 我有一个正在运行的服务器端计时器,它需要模拟单击 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包装在当前正在更新的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 回答

  • 1

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

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

    如果由于某种原因你不能超载,你可以使用像DoFixSplitter这样的替代符号 .

相关问题