如何从 JavaScript 调用 C# 函数?

Posted

技术标签:

【中文标题】如何从 JavaScript 调用 C# 函数?【英文标题】:How to call a C# function from JavaScript? 【发布时间】:2013-08-28 18:28:17 【问题描述】:

我想从 javascript 调用 CsharpFunction,这是代码隐藏中的 C# 函数。我尝试了下面的代码,但是无论 JavaScript 条件是 True 还是 FalseCsharpFunction 都被调用了!

JavaScript 代码:

if (Javascriptcondition > 0) 
   <%CsharpFunction();%>

后面的C#代码:

protected void CsharpFunction()

  // Notification.show();

【问题讨论】:

你这样做的方式是错误的。您编写的代码在服务器上执行,服务器不知道您的 javascript 条件。您可能想要使用 AJAX。 对不起半生不熟的答案!好吧,您可以在隐藏字段中使用表单发送您的条件,然后您可以检查其是否调用该方法的值。 你应该使用 Ajax 库 感谢大家这么有帮助的评论!我很感激你的努力,非常感谢!但是谁能给我一个如何使用ajax的例子!! 【参考方案1】:

你不能。 Javascript 运行客户端,C# 运行服务器端。

事实上,您的服务器将运行所有 C# 代码,生成 Javascript。然后,Javascript 在浏览器中运行。正如 cmets 中所说,编译器不知道 Javascript。

要调用服务器上的功能,您必须使用 AJAX 等技术,如其他答案中所述。

【讨论】:

daniweb.com/web-development/aspnet/threads/31065/… 这里 @Shyamsundarshah 描述了 AJAX 和 __doPostback,它们基本上是触发服务器运行某些东西的方法。但从某种意义上说,你是对的。【参考方案2】:

如果您打算从客户端进行服务器调用,您应该使用 Ajax - 查看类似 Jquery 并使用 $.Ajax() 或 $.getJson() 来调用服务器函数,具体取决于哪种类型你追求的回报或你想要执行的行动。

【讨论】:

【参考方案3】:

服务器端函数位于服务器端,客户端函数位于客户端。 你可以做的是你必须设置隐藏的表单变量并提交表单,然后在页面上使用Page_Load处理程序你可以访问变量的值并调用服务器方法。

更多信息可以找到here 和here

【讨论】:

【参考方案4】:

您可以使用 Web 方法和 Ajax:

<script type="text/javascript">             //Default.aspx
   function DeleteKartItems()      
         $.ajax(
         type: "POST",
         url: 'Default.aspx/DeleteItem',
         data: "",
         contentType: "application/json; charset=utf-8",
         dataType: "json",
         success: function (msg) 
             $("#divResult").html("success");
         ,
         error: function (e) 
             $("#divResult").html("Something Wrong.");
         
     );
   
</script>

[WebMethod]                                 //Default.aspx.cs
public static void DeleteItem()

    //Your Logic

【讨论】:

您的示例调用的是 c# 代码页,而不是函数。 我喜欢这个解决方案,但是默认的 IIS/ASP.NET 权限不允许$.ajax(...) 在没有身份验证的情况下调用控制器(这很好)。难道没有一种简单的方法可以调用控制器而不必降低页面的安全性吗?【参考方案5】:
.CS File    
    namespace Csharp
    
      public void CsharpFunction()
      
        //Code;
      
    

    JS code:
    function JSFunction() 
            <%#ProjectName.Csharp.CsharpFunction()%> ;
    

注意:在调用你的 CS 页面函数时在 JS 函数中......首先是项目名称,然后是 CS 页面的命名空间名称,然后是函数名称

【讨论】:

如果你没有找到你的函数,试着把它改成static 如何处理返回值?【参考方案6】:

一种现代方法是使用 jQuery Ajax(客户端)use ASP.NET Web API 2(服务器端)。

与页面方法和 ASMX Web 方法一样,Web API 允许您在 ASP.NET 中编写 C# 代码,这些代码可以从浏览器或任何地方调用,真的!

这是一个示例 Web API 控制器,它公开了 API 方法,允许客户端检索有关 1 个或所有产品的详细信息(在现实世界中,产品很可能从数据库中加载):

public class ProductsController : ApiController

    Product[] products = new Product[] 
     
        new Product  Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 , 
        new Product  Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M , 
        new Product  Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M  
    ;

    [Route("api/products")]
    [HttpGet]
    public IEnumerable<Product> GetAllProducts()
    
        return products;
    

    [Route("api/product/id")]
    [HttpGet]
    public IHttpActionResult GetProduct(int id)
    
        var product = products.FirstOrDefault((p) => p.Id == id);
        if (product == null)
        
            return NotFound();
        
        return Ok(product);
    

控制器使用这个示例模型类:

public class Product

    public int Id  get; set; 
    public string Name  get; set; 
    public string Category  get; set; 
    public decimal Price  get; set; 

获取和迭代产品列表的示例 jQuery Ajax 调用:

$(document).ready(function () 
    // Send an AJAX request
    $.getJSON("/api/products")
        .done(function (data) 
            // On success, 'data' contains a list of products.
            $.each(data, function (key, item) 
                // Add a list item for the product.
                $('<li>',  text: formatItem(item) ).appendTo($('#products'));
            );
        );
);

这不仅可以让您轻松创建一个现代 Web API,如果您需要变得非常专业并记录它,您也可以使用ASP.NET Web API Help Pages 和/或Swashbuckle。

Web API 可以改装(添加)到现有的 ASP.NET Web 窗体项目。在这种情况下,您需要将路由指令添加到文件Global.asax 中的Application_Start 方法中:

RouteTable.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/controller/id",
    defaults: new  id = System.Web.Http.RouteParameter.Optional 
);

文档

教程:Getting Started with ASP.NET Web API 2 (C#) 旧网站教程:Using Web API with ASP.NET Web Forms MSDN:ASP.NET Web API 2

【讨论】:

【参考方案7】:

使用 Blazor http://learn-blazor.com/architecture/interop/

这是 C#:

namespace BlazorDemo.Client

   public static class MyCSharpFunctions
   
       public static void CsharpFunction()
       
          // Notification.show();
       
   

然后是Javascript:

const CsharpFunction = Blazor.platform.findMethod(
"BlazorDemo.Client",
"BlazorDemo.Client",
"MyCSharpFunctions",
"CsharpFunction"
);
if (Javascriptcondition > 0) 
   Blazor.platform.callMethod(CsharpFunction, null)

【讨论】:

以上是关于如何从 JavaScript 调用 C# 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从网页Javascript调用C#方法? [关闭]

如何通过 JavaScript 从服务器端的网页调用客户端 C# 程序函数?

数组应该如何从 C# 传递给 Javascript 函数?

asp.net调用javascript返回值

在C#后面调用Javascript函数[重复]

如何从托管 WebBrowser 控件的应用程序调用 WebBrowser 控件查看的页面中的 JavaScript 函数?