使用ajax将JavaScript数组发送到后端(C#)的代码

10

我对 C# 和 JavaScript 有点新,所以虽然我的问题很具体,但我也开放接受任何其他的解决方案。

我有一个值数组(我在 JavaScript 函数中创建),我想将其发送到我的代码后台文件中,以便在方法中使用。根据我所了解的,使用 AJAX 并使用 JSON 将数组字符串化似乎是最佳方法。

我的问题是:

  1. 我能用这种方法传递数组吗?

  2. 如何在服务器端(在我的代码后台)捕获信息?

JavaScript 传递值

var jsonvalues = JSON.stringify(values);
var callback = window.location.href
$.ajax({
  url: callback
  type: "POST",
  contentType: 'application/json',
  data: jsonvalues
});

我看到许多解决方案使用[WebMethod]或某种WebService来捕获数据,我能否在不返回数据的情况下在代码后台文件中使用它来执行操作?

这是我在代码后台文件中正在使用的内容。

[WebMethod]
public static void done(string[] ids)
{
String[] a = ids;
}

谢谢!在详细阐述我的问题后,我意识到这是一个至关重要的组件。不过,我打算先尝试使用 Milimetric 的答案,使用 [HttpPost] - Matt Foxx Duncan
看一下这个问题Jquery AJAX with ASP.NET WebMethod Returning Entire Page。忽略返回内容的部分,看看他们如何构建url - Roman
谢谢提供的链接,我成功地进行了调用 -- 我收到了来自调用的success信息。但是,我的方法仍未被调用。 - Matt Foxx Duncan
上次评论的编辑时间已经用完了... 我想到了两个可能的原因... 1)我的代码后台使用了partial class并继承了基类System.Web.UI.UserControl而不是Page(正如我看到的大多数[WebMethod]示例使用的那样)。UserControl基类对于类中的其他方法是必需的,那么我需要让我的WebMethod继承Page吗? 2)我没有使用<asp:ScriptManager>或PageMethods,我需要它们吗? - Matt Foxx Duncan
看起来我无法将JavaScript发送到用户控件。我整天都在追寻这个问题,真是太棒了。 - Matt Foxx Duncan
显示剩余2条评论
3个回答

8
我已经为此编写了一个深入的ASP.NET MVC示例,但它可以轻松地适应WebForms。HTML和jQuery看起来几乎完全相同,除了调用WebMethod的位置之外。如果使用的页面名为“Default.aspx”,方法名为“Done”,则WebMethod的URL将为“Default.aspx/Done”。请参考此链接以使用jquery向MVC控制器发送数据。
<script>
       // Grab the information 
       var values = {"1,","2","3"};
       var theIds = JSON.stringify(values);

       // Make the ajax call
       $.ajax({
         type: "POST",
         url: "Default.aspx/Done", // the method we are calling
         contentType: "application/json; charset=utf-8",
         data: {ids: theIds },
         dataType: "json",
         success: function (result) {
             alert('Yay! It worked!');               
         },
         error: function (result) {
             alert('Oh no :(');
         }
     });
  </script>

您的WebMethod仍将保持不变。

[WebMethod]
public static void done(string[] ids)
{
   String[] a = ids;
   // Do whatever processing you want
   // However, you cannot access server controls
   // in a static web method.
}

0

最简单的方法是使用ASP.NET MVC并将数据绑定到列表。因此,对于字符串列表,这将非常容易。只需创建一个控制器操作,如下所示:

[HttpPost]
public ActionResult MyAction(string[] values)
{
    ... debug and see that values gets set to your array from javascript ...
}

接着在您的 $.ajax 调用中传递 data: values。无需字符串化,jQuery 会自动处理。对于更复杂的列表绑定,请查看此处(以及其他类似的资源,讨论如何绑定到复杂的对象列表):

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

如果要从网页或 Web 服务中调用 [WebMethod] 方法,请查看此指南:

http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/

基本上,您需要将URL设置为ServicePage.aspx/MethodName


我在$.ajax调用中是否仍需要指定contenttype?我应该为此调用使用processData:false吗? - Matt Foxx Duncan
我通常绑定强类型的东西,所以我设置表单并提交它们。在我的情况下,我甚至不需要使用$.ajax,我只使用$.post。这是我能给你的最好建议。按照您的方式设置它,并在我上面显示的控制器操作中设置断点。然后,查看请求对象并查看传递了哪些参数。基本上,您需要一个名为“values”的参数来具有逗号分隔的列表。然后,您可以根据自己的需求调整jQuery。 - Milimetric
感谢您的所有帮助!然而,我刚刚发现我正在构建的平台(Sitecore)还不支持MVC(将在本月底发布一个支持MVC的版本)。我正在尝试使用[WebMethod]来代替,正如@R0MANARMY所提到的,但是无法触发我编写的方法。我已经修改了ajax调用,将其更改为url:'Register/trigger',其中trigger是我的回调中的方法。我错过了什么吗?再次感谢您的所有帮助! - Matt Foxx Duncan
我会在我的答案中加入这个,但我认为如果你正在使用页面,则需要类似于 url:'Register.aspx/trigger' 这样的东西,如果你正在使用旧式服务,则需要 .asmx。 请查看此链接以获取更多信息:http://encosia.com/using-jquery-to-directly-call-aspnet-ajax-page-methods/ - Milimetric

-1
将您的数据放入一个带有runat=server属性的隐藏字段中。提交表单并正常获取数据。

那并不总是最安全的选择,我建议不要这样做。 - David East

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接