使用“WebMethod”调用 C# 方法返回“未定义”

Posted

技术标签:

【中文标题】使用“WebMethod”调用 C# 方法返回“未定义”【英文标题】:Calling C# method using "WebMethod" returns "undefined" 【发布时间】:2017-03-14 21:58:53 【问题描述】:

首先,我知道有很多与此类似的问题,但没有对我的特殊情况有帮助(我可能只需要澄清,我不需要想打开一个旧线程)。

我正在创建一个应用程序,我需要在一个 jQuery 函数中调用一个 C# 方法。我需要这样做的原因是因为我需要使用两个特定参数对数据库执行查询。

javascript

$(".button").click(function()
    var dataId = $(this).attr("data-Id");

    var s = PageMethods.returnStr(dataId, onSuccess, onError);
    function onSuccess(result)
        alert(s);
    
    function onError(result)
        alert("error");
    
);

C#:

[WebMethod]
public static string returnStr(string Id)
       
    // ... blah blah make query, return string s
    return s;

返回的字符串未定义。如果我使用 alert(result),我只会得到页面的语法。


我还尝试使用以下方法引用 c# 变量:

C#

public static string s;

JavaScript:

alert('<%=s%>');

这可行,但是当我调用 WebMethod 时,我无法修改 s。


我尝试过的最后一件事是 ajax,但即使我根据在 SO 上找到的答案对其进行建模,我也无法让它像我希望的那样工作 - 它返回“[object Object]”:

AJAX:

$.ajax(
    type: "POST",
    url: "default.aspx/returnStr",
    dataType: "json",
    contentType: 'application/json; charset=utf-8',
    error: function(result)
        alert("request failed" + result)
    ,
    success: function(result)
        alert(result);
    
);

非常感谢任何建议!

【问题讨论】:

如何调用 C# 方法? JavaScript 是沙盒的,所以不可能。 我不确定我是否 100% 理解您的意思。我正在调用类似 tihs 的函数: var s = PageMethods.populateInstructions(dataToggle, dataId, onSuccess, onError); 显示定义PageMethods的代码。 我的印象是添加 'EnablePageMethods="true"' 允许我使用 'PageMethods。 C#函数名'。我在这里错过了什么大事吗? 您的 AJAX 工作正常,问题是因为您使用 alert() 进行调试。请改用console.log(result) 【参考方案1】:

你不能按照你的提议去做。 Javascript 在网络浏览器中运行。 C# 在服务器上运行。您不能在浏览器中运行 C# 代码。

使用alert('&lt;%=s%&gt;'); 有效,因为它在发送到客户端之前在服务器上进行评估。

你有两个选择:

    制作一个纯 JavaScript 函数来满足您的需求。 使用来自 ASP 控件的普通 Web 表单事件处理程序(即按钮的 OnClick 方法)。 向服务器发出 AJAX 回调以执行您需要的操作。

我看到你尝试了#3,但你没有正确地做到这一点。 “default.aspx/returnStr”中的 URL 没有任何意义。它不会自动运行 default.aspx.cs 中的returnStr 方法。

你最好使用#2。这将是最简单的。

更新: 另一种选择是使用 asp 按钮,如 #2,然后在 OnClick 方法中使用 ClientScript.RegisterStartupScript,这将在回发完成后将 Javascript 注入页面。在您注入的那个 javascript 中,您可以运行代码来打开弹出窗口。

【讨论】:

问题是我正在创建一个动态按钮,单击该按钮会利用弹出功能 (vast-engineering.github.com/jquery-popup-overlay)。根据该功能的方式,我不能使用代码隐藏按钮单击事件。要么我需要调用 C# 按钮单击方法 触发弹出功能的 jquery 方法,要么我需要从 jquery 函数中引用 C#。根据您的说法,AJAX 可能是我最好的选择(?) returnStr 方法是做什么的,它必须在服务器上运行? 我需要对数据库进行查询,以便提取与每个单独按钮匹配的结果。例如,我制作按钮 1 到 5。然后我的表中有第 1 到 5 行。我需要为按钮 1 查询第 1 行,为按钮 2 查询第 2 行等。 真的只有 5 个值吗?您可以在页面加载时从数据库中提取所有 5 个值,并将它们嵌入到 javascript 中,以便在单击按钮时它们已经可用。 不,实际上它 > 150 左右。但是,如果我在页面加载时提取所有值,我仍然必须能够访问 JS 中的数据。我想我可以有一个 C# 数组,并像 一样引用它

以上是关于使用“WebMethod”调用 C# 方法返回“未定义”的主要内容,如果未能解决你的问题,请参考以下文章

在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON

C# Web 方法未在 javascript 中调用

如何在 Asp.net C# 中调用 webmethod

C#中的[WebMethod]的用法

C#中的[WebMethod]的用法

JQuery ajax 调用 httpget webmethod (c#) 不工作