【问题标题】:Passing a web service an unknown number of parameters向 Web 服务传递未知数量的参数
【发布时间】:2010-04-28 14:44:23
【问题描述】:

我对使用网络服务还比较陌生。我正在尝试创建一个将接受来自 ASP.Net 表单的数据,该表单的输入控件是在运行时动态创建的,我不知道将传递多少控件值。

我想我将在表单上使用 jQuery 的 serialize() 来获取数据,但是我让 Web 服务接受什么参数?我想也许我可以使用 serializeArray(),但我仍然不知道 JavaScript 数组要接受什么类型的变量。

最后,我想在将数据发送到 Web 服务之前,我可能需要使用数据创建一个简单的数据传输对象。如果有更简单的方法或我应该遵循的既定最佳实践,我只是不想通过 DTO 路线。

提前感谢您提供的任何指导,让我知道我不够清楚,或者如果您有任何问题。

【问题讨论】:

  • 我可能没有正确理解您的体系结构,但听起来您好像完全控制了将输入值传递给 Web 服务的 ASP.Net 表单。如果是这种情况,为什么还需要单独的 Web 服务?
  • 我有服务器处理,这是输入验证的一部分。根据控件 ID 中的详细信息,有一些特殊的验证规则。

标签: asp.net web-services json serialization


【解决方案1】:

标题问题的答案(假设这是一个 ASP.Net Web 服务)是在您的 Web 服务方法中使用 params 关键字:

[WebMethod]
public void SendSomething(params string[] somethings)
{
    foreach (string s in somethings)
    {
        // do whatever you're gonna do
    }
}

例子:

SendSomething("whatever");
SendSomething("whatever 1", "whatever 2", "whatever 3");

事实上,你甚至不需要 params 关键字 - 使用普通数组作为参数会让你传入未知数量的值。

【讨论】:

  • 我需要控件 ID 和值作为键值对,所以我尝试使用 var postData = $('#aspnetForm').serializeArray() 传递表单的 JSON 字符串;然后 $.ajax({ data: JSON.stringify(postData). 并将 Web 服务设置为接受错误的字符串数组“Type System.Collections.Generic.IDictionary`2[[System.String, ... 不是支持数组的反序列化。”。所以我想我可能需要一个多维数组并将 Web 服务的参数更改为 string[,] 并且仍然收到相同的异常。
  • 我是否正确假设您正尝试通过 AJAX 从客户端页面调用 Web 服务?表格是否太大而无法进行常规回发?
  • 你是对的。我试图不做回发,因为这基本上是一个更复杂的输入验证,但对用户来说,仍然只是输入验证。
  • 那么,您的问题可能出在您从 AJAX 调用 Web 服务的方式上。每当 C# 客户端调用 Web 服务时,序列化/反序列化的严重性被完全隐藏,您可以传入对象数组或几乎任何东西(甚至是 List)作为参数。我很确定您也可以传递 string[],但也许可以尝试定义您的 Web 服务方法来获取 object[] 并查看它的作用。
  • 哎呀,这可能比我想象的要简单。在您在这里的第一条评论中的代码中,您似乎正在尝试对只是单个字符串(即不是字符串 array)的东西调用 serializeArray()。
【解决方案2】:

好吧,我开始创建自己的数据传输对象,我想这始终是大脑解决方案的前沿,我只是想可能有一个公认的最佳实践来处理这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2023-03-28
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多