【问题标题】:Can Javascript disable an ASP.Net Control inside a UserControl?Javascript 可以禁用 UserControl 中的 ASP.Net 控件吗?
【发布时间】:2019-10-25 01:33:44
【问题描述】:

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);
}

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>

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

【问题讨论】:

  • 我是否可以建议您尝试重新编写代码以使用 SignalR (codeproject.com/Articles/526876/…)?它将向用户打开一个套接字,将更新所有需要的数据,并且可以设置为在一定时间后断开连接。我知道这意味着很大的返工,但它可能是值得的。其他建议是让更新面板更小,确保只发送非常需要的数据(数字或字符串),而不是一大堆 html 和 css。

标签: javascript asp.net user-controls


【解决方案1】:

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

但是为什么不让它变得更简单呢?如果您真的想让用户保持登录状态,那么为什么不对某个 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>

更多关于 jQuery 计时器的信息在这里:start & stop / pause setInterval with javascript, jQuery

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

how to increase session timeout in asp.net?

或使用持久 cookie 登录用户。通常在登录时你会看到一个复选框“让我登录”或“记住我”或类似的东西。

How to create persistent cookies in asp.net?

更新

每个用户每 5 秒更新 500kb 似乎是个坏主意,不管有没有 UpdatePanels。但这是一种从前端停止计时器的方法。

<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>

然后在后面的代码中

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

    if (HiddenField1.Value == "Stop!")
    {
        LiteralTest.Text = "Stopped";
        TimerAutoRefresh.Enabled = false;
    }
}

【讨论】:

  • 我不想让他们真正登录,只是希望他们在空闲时停止获取更新以减少服务器压力。
  • 如果你想减轻服务器的压力,请停止使用 UpdatePanel 并使用纯 jQuery/Ajax 解决方案来获取更新。
  • @Landmine - 你能解释一下“空闲用户”究竟是如何给服务器带来压力的吗?我觉得在用户空闲时收到回发有点奇怪。或者我没有正确理解这个问题?
  • VDWWD 我同意你的看法,但是在项目的这一点上这是不可能的。 @theCuriousOne UpdatePanel 位于每 5 秒刷新一次数据的计时器上。因为 VDWWD 暗示的 UpdatePanel 不太好,所以它们会生成大量回发并每 5 秒为每位用户刷新约 500KB 的数据。
  • 更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多