如何使用 javascript 调用 ASP.NET c# 方法

     2023-03-31     137

关键词:

【中文标题】如何使用 javascript 调用 ASP.NET c# 方法【英文标题】:how to call an ASP.NET c# method using javascript 【发布时间】:2011-10-28 17:16:24 【问题描述】:

有谁知道如何使用 javascript 调用服务器端 c# 方法?我需要做的是如果选择取消则停止导入,或者如果选择确定则继续导入。我使用 Visual Studio 2010 和 C# 作为我的编程语言

这是我的代码:

private void AlertWithConfirmation()            
                 
    Response.Write(
        "<script type=\"text/javascript\">" +     
            "if (window.confirm('Import is currently in progress. Do you want to continue with importation? If yes choose OK, If no choose CANCEL')) " +     
                "window.alert('Imports have been cancelled!');" +     
            " else " +   
                "window.alert('Imports are still in progress');" +     
            "" +      
        "</script>");   

【问题讨论】:

最简单的方法可能是使用 jQuery 或相关框架将 AJAX 请求发送回服务器:api.jquery.com/jQuery.ajax 所以在您的取消块中,创建请求并发送到服务器。如果您需要更多信息,请询问。 【参考方案1】:

PageMethod 一种更简单、更快速的 Asp.Net AJAX 方法 通过释放 AJAX 的力量,我们可以轻松地提高 Web 应用程序的用户体验和性能。我喜欢 AJAX 中最好的东西之一是 PageMethod。

PageMethod 是一种我们可以在 java 脚本中公开服务器端页面方法的方法。这带来了很多机会,我们可以在不使用缓慢而烦人的回传的情况下执行大量操作。

在这篇文章中,我将展示 ScriptManager 和 PageMethod 的基本用法。在这个例子中,我正在创建一个用户注册表单,用户可以在其中使用他的电子邮件地址和密码进行注册。这是我要开发的页面的标记:

<body>
    <form id="form1" runat="server">
    <div>
        <fieldset style="width: 200px;">
            <asp:Label ID="lblEmailAddress" runat="server" Text="Email Address"></asp:Label>
            <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
            <asp:Label ID="lblPassword" runat="server" Text="Password"></asp:Label>
            <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
        </fieldset>
        <div>
        </div>
        <asp:Button ID="btnCreateAccount" runat="server" Text="Signup"  />
    </div>
    </form>
</body>
</html>

要设置页面方法,首先你必须在你的页面上拖一个脚本管理器。

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>

另外请注意我已更改EnablePageMethods="true"。 这将告诉 ScriptManager 我将从客户端调用 PageMethods。

现在下一步是创建一个服务器端函数。 这是我创建的函数,该函数验证用户的输入:

[WebMethod]
public static string RegisterUser(string email, string password)

    string result = "Congratulations!!! your account has been created.";
    if (email.Length == 0)//Zero length check
    
        result = "Email Address cannot be blank";
    
    else if (!email.Contains(".") || !email.Contains("@")) //some other basic checks
    
        result = "Not a valid email address";
    
    else if (!email.Contains(".") || !email.Contains("@")) //some other basic checks
    
        result = "Not a valid email address";
    

    else if (password.Length == 0)
    
        result = "Password cannot be blank";
    
    else if (password.Length < 5)
    
        result = "Password cannot be less than 5 chars";
    

    return result;

要告诉脚本管理器这个方法可以通过 javascript 访问,我们需要确保两件事:首先:这个方法应该是“public static”。 第二:方法上面应该有一个[WebMethod]标签,如上代码所写。

现在我已经创建了创建帐户的服务器端函数。现在我们必须从客户端调用它。以下是我们如何从客户端调用该函数:

<script type="text/javascript">
    function Signup() 
        var email = document.getElementById('<%=txtEmail.ClientID %>').value;
        var password = document.getElementById('<%=txtPassword.ClientID %>').value;

        PageMethods.RegisterUser(email, password, onSucess, onError);

        function onSucess(result) 
            alert(result);
        

        function onError(result) 
            alert('Cannot process your request at the moment, please try later.');
        
    
</script>

要调用我的服务器端方法注册用户,ScriptManager 会生成一个代理功能,该功能在 PageMethods 中可用。 我的服务器端函数有两个参数,即电子邮件和密码,在这些参数之后,我们必须再提供两个函数名称,如果方法成功执行(第一个参数即 onSucess)或方法失败(第二个参数即结果)将运行它们)。

现在一切似乎都准备好了,现在我在我的注册按钮上添加了OnClientClick="Signup();return false;"。所以这里是我的aspx页面的完整代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
        </asp:ScriptManager>
        <fieldset style="width: 200px;">
            <asp:Label ID="lblEmailAddress" runat="server" Text="Email Address"></asp:Label>
            <asp:TextBox ID="txtEmail" runat="server"></asp:TextBox>
            <asp:Label ID="lblPassword" runat="server" Text="Password"></asp:Label>
            <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox>
        </fieldset>
        <div>
        </div>
        <asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="Signup();return false;" />
    </div>
    </form>
</body>
</html>

<script type="text/javascript">
    function Signup() 
        var email = document.getElementById('<%=txtEmail.ClientID %>').value;
        var password = document.getElementById('<%=txtPassword.ClientID %>').value;

        PageMethods.RegisterUser(email, password, onSucess, onError);

        function onSucess(result) 
            alert(result);
        

        function onError(result) 
            alert('Cannot process your request at the moment, please try later.');
        
    
</script>

【讨论】:

感谢@Fahad,但我收到错误:Microsoft JScript runtime error: 'PageMethods' is undefined... 对我来说,问题似乎是在母版页中实现这一点。 [WebMethod][System.Web.Services.WebMethod] 的缩写 谢谢,不知道。就我而言,由于“静态”WebMethod,我无法访问我的类函数。通过 UpdatePanel (UpdateMode="Conditional") 解决了这个问题,一个 css-hidden asp:Button 是 onClick 函数可以访问我的类函数。通过 JavaScript 点击按钮。为我工作。希望这是其他人的替代品:-)。【参考方案2】:

我怀疑您需要进行 Ajax 调用。这是一个由 jQuery 创建的 Ajax 示例,可帮助您入门。该代码将用户登录到我的系统,但返回一个关于它是否成功的布尔值。请注意方法背后的代码中的 ScriptMethod 和 WebMethod 属性。

在标记中:

 var $Username = $("#txtUsername").val();
            var $Password = $("#txtPassword").val();

            //Call the approve method on the code behind
            $.ajax(
                type: "POST",
                url: "Pages/Mobile/Login.aspx/LoginUser",
                data: "'Username':'" + $Username + "', 'Password':'" + $Password + "' ", //Pass the parameter names and values
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                async: true,
                error: function (jqXHR, textStatus, errorThrown) 
                    alert("Error- Status: " + textStatus + " jqXHR Status: " + jqXHR.status + " jqXHR Response Text:" + jqXHR.responseText) ,
                success: function (msg) 
                    if (msg.d == true) 
                        window.location.href = "Pages/Mobile/Basic/Index.aspx";
                    
                    else 
                        //show error
                        alert('login failed');
                    
                
            );

在代码后面:

/// <summary>
/// Logs in the user
/// </summary>
/// <param name="Username">The username</param>
/// <param name="Password">The password</param>
/// <returns>true if login successful</returns>
[WebMethod, ScriptMethod]
public static bool LoginUser( string Username, string Password )

    try
    
        StaticStore.CurrentUser = new User( Username, Password );

        //check the login details were correct
        if ( StaticStore.CurrentUser.IsAuthentiacted )
        
            //change the status to logged in
            StaticStore.CurrentUser.LoginStatus = Objects.Enums.LoginStatus.LoggedIn;

            //Store the user ID in the list of active users
            ( HttpContext.Current.Application[ SessionKeys.ActiveUsers ] as Dictionary<string, int> )[ HttpContext.Current.Session.SessionID ] = StaticStore.CurrentUser.UserID;

            return true;
        
        else
        
            return false;
        
    
    catch ( Exception ex )
    
        return false;
    

【讨论】:

【参考方案3】:

我将继续提供一个使用 jQuery 的解决方案,这意味着如果您还没有导入该库,您将需要...

在页面标记中导入 jQuery 库:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>

然后创建另一个 *.js 脚本文件(我称之为 ExecutePageMethod,因为这是它要公开的唯一方法)并导入它:

<script type="text/javascript" src="/ExecutePageMethod.js" ></script>

在新添加的文件中,添加以下代码(我记得是从其他地方提取的,所以其他人确实值得称赞):

function ExecutePageMethod(page, fn, paramArray, successFn, errorFn) 
    var paramList = '';
    if (paramArray.length > 0) 
        for (var i = 0; i < paramArray.length; i += 2) 
            if (paramList.length > 0) paramList += ',';
            paramList += '"' + paramArray[i] + '":"' + paramArray[i + 1] + '"';
        
    
    paramList = '' + paramList + '';
    $.ajax(
        type: "POST",
        url: page + "/" + fn,
        contentType: "application/json; charset=utf-8",
        data: paramList,
        dataType: "json",
        success: successFn,
        error: errorFn
    );

然后您需要使用适当的属性来扩充您的 .NET 页面方法,例如:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public static string MyMethod()

    return "Yay!";

现在,在您的页面标记内、script 块内或从另一个脚本文件中,您可以调用该方法,如下所示:

ExecutePageMethod("PageName.aspx", "MyMethod", [], OnSuccess, OnFailure);

显然您需要实现OnSuccessOnFailure 方法。

要使用结果,比如在OnSuccess 方法中,您可以使用 parseJSON 方法,如果结果变得更复杂(例如,在这种情况下或返回类型数组),此方法将解析它进入对象:

function OnSuccess(result) 
    var parsedResult = jQuery.parseJSON(result.d);

这个ExecutePageMethod 代码特别有用,因为它可重复使用,因此不必为您可能要执行的每个页面方法管理$.ajax 调用,您只需将页面、方法名称和参数传递给这个方法。

【讨论】:

是否需要页面上的ScriptManager工具才能使用此方法?使用上面选择的答案时,我的所有脚本加载似乎都有问题。【参考方案4】:

Jayrock RPC library 是一个很好的工具,可以以 C# 开发人员非常熟悉的方式执行此操作。它允许您使用所需的方法创建一个 .NET 类,并将该类作为脚本(以一种迂回的方式)添加到您的页面中。然后,您可以创建一个您的类型的 js 对象并像调用任何其他对象一样调用方法。

它本质上隐藏了 ajax 实现并以熟悉的格式呈现 RPC。请注意,最好的选择确实是使用 ASP.NET MVC 并使用 jQuery ajax 调用操作方法 - 更简洁,更少混乱!

【讨论】:

【参考方案5】:

有多种选择。您可以根据自己的目的使用WebMethod 属性。

【讨论】:

如何使用 QT/python 从 Javascript 调用 C++ 函数?

】如何使用QT/python从Javascript调用C++函数?【英文标题】:howtoinvokeC++functionsfromJavascriptusingQT/python?【发布时间】:2013-09-3009:12:40【问题描述】:我有一个嵌入式系统,它的GUI是使用html开发的。在里面,HTML,我正在写javascripts。现... 查看详情

如何使用 javascript 调用 ASP.NET c# 方法

】如何使用javascript调用ASP.NETc#方法【英文标题】:howtocallanASP.NETc#methodusingjavascript【发布时间】:2019-02-2801:05:37【问题描述】:有谁知道如何使用javascript调用服务器端c#方法?我需要做的是,如果选择取消,则停止导入,如果选... 查看详情

如何使用 javascript 调用 ASP.NET c# 方法

】如何使用javascript调用ASP.NETc#方法【英文标题】:howtocallanASP.NETc#methodusingjavascript【发布时间】:2011-10-2817:16:24【问题描述】:有谁知道如何使用javascript调用服务器端c#方法?我需要做的是如果选择取消则停止导入,或者如果选... 查看详情

如何在 JavaScript 中使用 JSONP 请求执行 Ajax 调用? [复制]

】如何在JavaScript中使用JSONP请求执行Ajax调用?[复制]【英文标题】:HowtoperformAjaxcallwithJSONPrequestinJavaScript?[duplicate]【发布时间】:2017-05-1311:16:09【问题描述】:我使用纯JavaScript在另一个域(跨域)中进行ajax调用。所以我需要指... 查看详情

如何从 JavaScript 调用使用 DDC 创建的 Dart 库?

】如何从JavaScript调用使用DDC创建的Dart库?【英文标题】:HowcanIcallaDartlibrarycreatedwithDDCfromJavaScript?【发布时间】:2017-11-1917:18:38【问题描述】:我在Dart中创建了一个需要从JavaScript调用的大型库。如果可能,我想避免使用JSInterop... 查看详情

如何使用 JavaScriptCore 从 Swift 中的 javascript SDK 调用异步 javascript 函数

】如何使用JavaScriptCore从Swift中的javascriptSDK调用异步javascript函数【英文标题】:HowtocallanasyncjavascriptfunctionfromajavascriptSDKinSwiftwithJavaScriptCore【发布时间】:2017-10-3021:14:07【问题描述】:我正在尝试使用JSCore从Swift中的javascriptSDK执... 查看详情

如何使用 javascript/jquery/AJAX 调用 Django REST API?

】如何使用javascript/jquery/AJAX调用DjangoRESTAPI?【英文标题】:HowtocallDjangoRESTAPIsusingjavascript/jquery/AJAX?【发布时间】:2016-10-2306:31:02【问题描述】:我想使用Javascript、jQuery、AJAX在前端调用DjangoRestAPI。请求方法是POST但是当我看到API... 查看详情

如何找出使用 javascript/jquery 调用函数的次数?

】如何找出使用javascript/jquery调用函数的次数?【英文标题】:HowdoIfindouthowmanytimesafunctioniscalledwithjavascript/jquery?【发布时间】:2022-01-2210:57:54【问题描述】:也许是一个奇怪的问题,但它是这样的:我有一个定期调用的函数,在... 查看详情

如何使用 BeautifulSoup 和 Python 调用 JavaScript 函数

】如何使用BeautifulSoup和Python调用JavaScript函数【英文标题】:HowtocallJavaScriptfunctionusingBeautifulSoupandPython【发布时间】:2018-07-1404:10:37【问题描述】:作为我项目的一部分,我正在执行网络抓取以从网站获取数据。我可以提出请求... 查看详情

如何使用phonegap从javascript调用ios方法?

】如何使用phonegap从javascript调用ios方法?【英文标题】:howtocalliosmethodfromjavascriptusingphonegap?【发布时间】:2012-08-2106:35:19【问题描述】:我是IOS中phonegap的新手。我按照电话间隙的指导线制作项目。但现在我想向前迈出一步。如... 查看详情

如何在 javascript 中使用字符串调用函数?

】如何在javascript中使用字符串调用函数?【英文标题】:HowcanIcallafunctionusingastringinjavascript?【发布时间】:2013-09-1707:16:43【问题描述】:我已经知道有一个类似的问题,但似乎无法使其发挥作用。请告诉我需要做什么。示例:... 查看详情

如何从 javascript 调用 IBM Watson 服务

】如何从javascript调用IBMWatson服务【英文标题】:howtocallIBMWatsonservicesfromjavascript【发布时间】:2017-08-2315:04:12【问题描述】:我正在使用IBMWatson服务实现一个虚拟代理。我的应用程序是使用Jquery、AngularJS和Java开发的。目前我正在... 查看详情

如何创建交叉淡入淡出,以便我可以使用 javascript 调用 css 中的关键帧?

】如何创建交叉淡入淡出,以便我可以使用javascript调用css中的关键帧?【英文标题】:Howdoicreateacrossfadingsoicanusejavascripttocallthekeyframesinthecss?【发布时间】:2019-08-0513:27:19【问题描述】:我正在尝试在html中对我的照片创建淡入淡... 查看详情

如何使用 JavaScript 调用 asp:Button OnClick 事件? [复制]

】如何使用JavaScript调用asp:ButtonOnClick事件?[复制]【英文标题】:Howtocallaasp:ButtonOnClickeventusingJavaScript?[duplicate]【发布时间】:2013-02-1908:52:58【问题描述】:我有一个问题,我有一个如下按钮:<asp:ButtonID="savebtn"runat="server"OnClick... 查看详情

如何从Android调用javascript?

】如何从Android调用javascript?【英文标题】:HowtocalljavascriptfromAndroid?【发布时间】:2011-11-2413:43:50【问题描述】:我们如何从Android调用javascript?我有这个我想使用的javascript库,我想调用javascript函数并将结果值传递给androidjava代... 查看详情

页面如何从使用 Require() 的 javascript 文件中调用函数?

】页面如何从使用Require()的javascript文件中调用函数?【英文标题】:HowcanapagecallafunctionfromajavascriptfilethatusesRequire()?【发布时间】:2021-01-0904:30:53【问题描述】:这里是新手编码器。通过拼凑教程,我创建了一个.js模块,它使用G... 查看详情

在 Thymeleaf 中使用 onClick 时如何将参数传递给 javascript 函数调用

】在Thymeleaf中使用onClick时如何将参数传递给javascript函数调用【英文标题】:HowtopassargumentstojavascriptfunctioncallwhenusingonClickinThymeleaf【发布时间】:2019-09-0715:07:34【问题描述】:我一直在从Thymeleaf调用我的javascript函数,如下所示:... 查看详情

如何使用 xforms:load 在 xforms 页面中嵌入 javascript 然后调用它?

】如何使用xforms:load在xforms页面中嵌入javascript然后调用它?【英文标题】:HowcanIusexforms:loadtoembedajavascriptinanxformspageandthencallit?【发布时间】:2017-06-0422:42:12【问题描述】:我知道我们在模型的xforms-ready事件中使用xf:load调用JavaScr... 查看详情