Javascript可以禁用UserControl内部的ASP.Net控件吗?

Lan*_*ine 7 javascript asp.net user-controls

Javascript可以禁用UserControl内部的ASP.net控件吗?我的Javascript文件是从MasterPage中调用的,我也已经从ContentPage中尝试过它。

我正在尝试将Javascript用作空闲计时器,以减少服务器回发而不会注销用户。当用户重新将注意力集中在窗口上时,计时器将重新启动并再次刷新,直到用户闲置30分钟并暂停ASP.Net计时器为止。

Javascript:

var timer = $find('<%= TimerAutoRefresh.ClientID %>');
if (timer) {
    //stop the timer
    timer._stopTimer();
    timer.set_enabled(false);
    console.log("Timer disabled: " + timer);
}
Run Code Online (Sandbox Code Playgroud)

ASP.net ASCX

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <asp:Timer ID="TimerAutoRefresh" runat="server" Interval="5000" Enabled="true"></asp:Timer>
<asp:Literal ID="LiteralTest" runat="server">Timestamp</asp:Literal>
    </ContentTemplate>
</asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)

我试过$ find和document.getElementById,但无法获取ID。当我使用ClientIDMode="Static"该页面时,它会每5秒刷新一次,因为它会执行完整的回发。

VDW*_*WWD 4

首先,使用UpdatePanel仍然会导致页面执行完整的PostBack,但只有更新的部分会再次发送到浏览器,因此不会减少服务器负载。其次,您无法像这样访问计时器控件。

但为什么不让它变得更简单呢?如果您确实想让用户保持登录状态,那么为什么不对某个 url 发出 Ajax 请求来保持会话处于活动状态。

<script>
    var timer;
    var interval = 2500;

    function startTimer() {
        timer = setInterval(function () {
            $.ajax({
                type: 'GET',
                url: 'Default.aspx'
            });
        }, interval); 
    }

    function stopTimer() {
        clearInterval(timer);
    }

    startTimer();
</script>
Run Code Online (Sandbox Code Playgroud)

有关 jQuery 计时器的更多信息,请参见此处:start & stop/pause setInterval with javascript, jQuery

但您也可以增加 apsnet 注销用户所需的超时时间。

如何增加asp.net中的会话超时?

或者使用持久 cookie 登录用户。通常登录时您会看到一个复选框“保持登录状态”或“记住我”或类似的内容。

如何在asp.net中创建持久cookie?

更新

无论有没有 UpdatePanel,每用户每 5 秒更新 500kb 似乎都是一个坏主意。但这里有一种方法可以从前端停止计时器。

<asp:UpdatePanel ID="UpdatePanel" runat="server">
    <ContentTemplate>
        <asp:Timer ID="TimerAutoRefresh" runat="server" Interval="5000" Enabled="true" OnTick="TimerAutoRefresh_Tick"></asp:Timer>
        <asp:Literal ID="LiteralTest" runat="server">Timestamp</asp:Literal>
        <asp:HiddenField ID="HiddenField1" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

<button id="StopTimer">Stop Timer</button>

<script>
    $('#StopTimer').bind('click', function (e) {
        $('#<%= HiddenField1.ClientID %>').val('Stop!');
        e.preventDefault();
    });
</script>
Run Code Online (Sandbox Code Playgroud)

然后在后面的代码中

protected void TimerAutoRefresh_Tick(object sender, EventArgs e)
{
    LiteralTest.Text = DateTime.Now.ToString();

    if (HiddenField1.Value == "Stop!")
    {
        LiteralTest.Text = "Stopped";
        TimerAutoRefresh.Enabled = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您想减轻服务器压力,请停止使用 UpdatePanel 并使用纯 jQuery/Ajax 解决方案来获取更新。 (3认同)