【问题标题】:In ASP.net C# is there a way I can pass control to my CS from Javascript?在 ASP.net C# 中有没有一种方法可以将控制权从 Javascript 传递给我的 CS?
【发布时间】:2014-09-19 04:06:57
【问题描述】:

我正在尝试按照本指南在我的应用程序中实现 Facebook 登录:https://developers.facebook.com/docs/facebook-login/login-flow-for-web/v2.0

facebook 的东西都运行良好 :)

但是,在完成 facebook 身份验证后,我想将所有适当的变量传递给网页后面的 C# 代码以进入我的数据库,然后再重定向到注册过程的下一部分。

我知道如何在 HTML 中使用 asp 标签来做到这一点,例如:

<asp:ImageButton id=ctrlNext runat="server" ImageUrl="Btn_Next.gif" onclick="ctrlNext_Click"></asp:ImageButton>

但是,如果从 Facebook 完成后,控件当前位于 javascript 函数中 - 我不希望用户必须手动单击按钮才能继续 - 理想情况下,他们单击 facebook 登录按钮,我调用 facebook API,然后调用页面已存储信息的重定向。

【问题讨论】:

    标签: c# javascript asp.net .net asp.net-web-api


    【解决方案1】:

    一般来说,(假设您使用的是 MVC)您需要向应用程序中的控制器方法发布信息,以保存数据。见jQuery .post() documentation

    如果不使用 MVC,AJAX Control Toolkit 之类的东西可能会起作用。自从我没有做 MVC 工作以来已经很久了,我不知道在那里做 AJAX 的最新方法是什么。

    【讨论】:

    • 我没有使用 MVC!但是,我认为发回我的 .cs 仍然可以。
    • 不使用 MVC 肯定还是可以的。以上编辑
    【解决方案2】:

    在这段代码中,它显示“// 登录到您的应用和 Facebook”。您可以调用您的控制器方法并传递令牌和其他需要的参数,然后将参数保存到数据库并重定向到您的主页或启动页面。

    FB.login(function(response) {
      if (response.status === 'connected') {
        // Logged into your app and Facebook.
      } else if (response.status === 'not_authorized') {
        // The person is logged into Facebook, but not your app.
      } else {
        // The person is not logged into Facebook, so we're not sure if
        // they are logged into this app or not.
      }
    });
    

    编辑 1-

    在 WebForms 中,您可以像下面这样编写 js 并从 FB.login function valSubmit() { var doc = document.forms[0]; 调用它doc.submit();返回真;其中 form[0] 是您的实际表单。您将在 CS 代码中获得回发

    【讨论】:

    • 你会使用什么语法来调用服务器端的函数?
    • 在 WebForms 中,你可以像下面这样编写 js 并从 FB.login 其中 form[0] 是您的实际表单。您将收到 CS 代码的回发。
    • 这是一个网络表单,所以这看起来很有希望 - 但“-”不会让我走得太远;)
    【解决方案3】:

    使用PageMethods and Ajax

    确保包含以下使用语句:

    using System.Web.Services;
    

    您的 PageMethod 将类似于:

    [WebMethod]
    public static string fbLogin()
    {
      /* Do your DB Magic Here */
    }
    

    使用 jQuery.ajax 方法:

    FB.login(function(response) {
      if (response.status === 'connected') {
        // Logged into your app and Facebook.
        $.ajax({
           type: "POST",
           url: "YouPageName.aspx/fbLogin",
           data: "{}",
           contentType: "application/json; charset=utf-8",
           dataType: "json",
           success: function(msg) {
           // Do something interesting here.
           //Like a redirect 
              document.location.href = "http://www.somewherecool.com/newPage.aspx";
         }
        });
      } else if (response.status === 'not_authorized') {
        // The person is logged into Facebook, but not your app.
      } else {
        // The person is not logged into Facebook, so we're not sure if
        // they are logged into this app or not.
      }
    });
    

    这只是入门的基本内容。不要忘记充实错误处理等。

    但是

    当您要进行重定向时,您有点违背了使用 AJAX 的目的。有几种方法可以使用 javascript 来获取要回发的页面。最快、最简单和最简单的方法是使用一个带有普通服务器端点击处理程序的 asp 按钮,该处理程序通过 CSS 隐藏。然后在下面的例子中使用javascipt(jquery)来点击按钮。

    按钮

    <asp:ImageButton id="ctrlNext" style="display:none" runat="server" ImageUrl="Btn_Next.gif" onclick="ctrlNext_Click"></asp:ImageButton>
    

    javascript

    FB.login(function(response) {
      if (response.status === 'connected') {
        // Logged into your app and Facebook.
        //CLick the button
         $("#<%=ctrlNext.ClientID%>").click();
      } else if (response.status === 'not_authorized') {
        // The person is logged into Facebook, but not your app.
      } else {
        // The person is not logged into Facebook, so we're not sure if
        // they are logged into this app or not.
      }
    });
    

    【讨论】:

    • 如果这是静态的.....并且有 2 个用户尝试同时登录,他们会不会使用该函数的同一个实例并因此而纠结?
    • 另外 - 当我尝试 [WebMethod] 属性时会抛出错误,提示缺少程序集引用?
    • 请参阅这篇文章,了解为什么 WebMethods 必须是静态的:encosia.com/why-do-aspnet-ajax-page-methods-have-to-be-static。还要记住,它是静态的方法,而不是类,即页面类。所以没有多个用户不会“纠结”起来。
    • 有时您会发现程序集引用未包含在您要使用的 using 语句中。在 Visual Studio 中的代码中,您的 WebMethod 语句可能带有红色波浪线下划线。点击它,W 下应该会出现一个蓝色的“提示”。将鼠标悬停在上面并单击出现的图标,选择using System.Web.Services;,然后将其添加到页面顶部的 using 语句中。当您不记得要使用的确切 using 语句时,在向页面添加 linqStringBuilders 之类的内容时,这种技术会派上用场。
    • 正确,您将无法进行服务器端重定向。但是,在 ajax 调用的成功函数中,您可以使用 javascript。我会更新答案。
    【解决方案4】:

    在 MVC 中,只需制作一个控制器并使用 jquery ajax 发布到控制器方法。

    或者,在 Web 表单中

    创建一个通用 HTTP 处理程序,例如

    LoginStuff.ashx
    

    在控制器上创建一个返回字符串的方法,并使用 JavascriptSerializer 类返回 JSON 字符串。

    然后以同样的方式调用 ASHX 处理程序,jQuery Ajax。

    您可以将数据发布到 ashx 处理程序,然后 javascript 端的 ajax Success 方法将取回您的方法返回的 JSON 对象。

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      相关资源
      最近更新 更多