【问题标题】:How to call a client-side method from an asp.net method?如何从 asp.net 方法调用客户端方法?
【发布时间】:2009-03-19 21:12:46
【问题描述】:

我有以下 javascript:

<script type="text/javascript">
    function showjQueryDialog() {
        $("#dialog").dialog("open");
    }

    $(document).ready(function() {
        $("#dialog").dialog({
           autoOpen: false,
           modal: true,
           buttons: { "Renew Membership": function() { $(this).dialog("close"); } }
        });
    });
</script>

我在记录用户的页面上有一个 asp:Button。这是我希望在服务器端单击按钮时发生的示例:

protected void LoginButton_OnClick(object sender, EventArgs e)
{
    UserProfile profile = UserProfile.GetUserProfile(txtUserName.Text);

    TimeSpan ts = profile.Expiration.Subtract(DateTime.Now);

    if(ts.Days <= 30)
      //call showJQueryDialog() to open the dialog box
      Page.ClientScript.RegisterStartupScript(typeof(Login2), "showjquery",   
      "showJQueryDialog();", true);
    else
     //log the user in as normal.

}

我如何将如下方法附加到对话框上的更新按钮

public void Renew()
{
    Response.Redirect("Renew.aspx");
}

【问题讨论】:

    标签: asp.net jquery jquery-ui


    【解决方案1】:

    由于无法调用客户端函数,我建议在 javascript 中发出决策所需的信息,并使一切都在客户端发生。

    或者,您也可以根据之前评论者的建议重新加载页面。

    【讨论】:

      【解决方案2】:
      if(ts.Days <= 30)
          ScriptManager.RegisterStartupScript(
              typeof(MyPage), "showjquery", 
              "$(document).ready(function() { showJQueryDialog(); };", 
              true
          )
      else
           //log the user in as normal.
      

      把它放在你有的地方://调用 showJQueryDialog() 来打开对话框

      更新 1:您似乎正在使用更新面板,在这种情况下,您需要使用 ScriptManager.RegisterStartupScript

      更新 2:您还希望将 js 调用包装在 jquery .ready 调用中,因此在配置对话框之前不会触发它。这比连接正文 onload 更好,因为 onload 等待图像加载,因此 .ready 会更快显示(取决于加载的图像和其他信息位)。

      【讨论】:

      • 我将如何处理我的 if 语句,我会在里面放什么?
      • 好的,我会试试的。你知道 ClientScript 在什么命名空间,MyPage 和“showjquery”参数是什么。
      • 我把它放在了if语句中,但是没有弹出对话框。 Login2 是我的页面的名称。 Page.ClientScript.RegisterStartupScript(typeof(Login2), "showjquery", "showJQueryDialog();", true);
      • 首先检查您的 showjQueryDialog javascript 是否运行良好 - 在浏览器中单击登录后查看 html 源代码,您应该会看到 showJQueryDialog 在那里。
      【解决方案3】:

      我真的不明白弗雷迪对此的态度。我可能误解了一些东西。正如devdimi指出的那样,在我看来,这里只有两种可能性。要么:

      a) 在客户端 onClick javascript 中执行所有逻辑。您可以调用在服务器端 OnClick 中执行操作的 AJAX 方法,然后在 AJAX 回调中调用您的 jQuery 弹出窗口。

      b) 进行回发,处理服务器端 OnClick,然后为在正文 onLoad 事件中运行的页面附加 javascript:

      body.Attributes.Add("onLoad", "showJQueryDialog();")

      【讨论】:

      • @Bryan 选项 b 相当于我的 - 发送 js 以在客户端上执行,请参阅我的第二次更新,使用 .ready 代替。关于选项a,他没有提到他最初使用的是ajax(一种/更新面板),我不确定你是否需要做任何特别的事情,尽管他正在登录用户。
      • 好的,现在我已经阅读了我看到的文档。出于某种原因,我错误地认为 RegisterStartupScript 命名错误并且实际上并没有在 onLoad 中执行您的脚本。
      • @Bryan 从技术上讲,它并没有将其放在 onload 上,而是将其设置在页面末尾-我更新了呈现的脚本,因此它附加到 jquery 的 .ready (这也不是技术上使用 onload,但确实等待 DOM 准备好)
      【解决方案4】:

      我会保留一个隐藏的 LinkBut​​ton,然后在 javascript 中调用 __doPostBack 方法。

      <asp:LinkButton runat="server" ID="Renew" OnClick="Renew_Click" style="display:none" />
      

      jQuery

      $(document).ready(function() {
          $("#dialog").dialog({
             autoOpen: false,
             modal: true,
             buttons: { "Renew Membership": function() { 
                $(this).dialog("close"); 
                __doPostBack('Renew', '');
               // or if inside a master page something like this
                __doPostBack('ctl00$ContentPlaceHolder1$Renew', '');
             } }
          });
      });
      

      【讨论】:

        【解决方案5】:

        我对 IE8 也有类似的问题。

        我们正在使用 ASP.NET,并且任何时候我们在 PageLoad/Control-Events IE8 中执行 Response.Redirect 都会将所有基本 DOM 对象设置为未定义(图像、窗口、文档) 但是如果我们在 PreInit 事件期间进行重定向,那么 IE8 就可以了。可爱的

        【讨论】:

          猜你喜欢
          • 2011-03-21
          • 2019-09-14
          • 2012-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          相关资源
          最近更新 更多