4

我想要一个看起来像这样的方法(api操作方法):

public List<User> GetUserList(int userId, string commaSeperatedListOfIds)
{
...

}

据我了解,web api控制器会自动转换json请求并映射参数,所以最好创建一个自定义类作为参数,例如:

public class UserListRequest
{
    public int UserId {get;set;}
    public string CsvListOfIds {get;set;}
}
4

2 回答 2

1

据我了解,web api控制器会自动转换json请求并映射参数,所以最好创建一个自定义类

是的,如果随请求传递的数据可以映射到对象,Web API 会将 JSON 或 XML 对象转换为类对象。

如果您希望您的 json 数据进入您的方法的对象中,那么首先定义一个将保存您的 json 数据的类。

public class UserListRequest
{
    public int UserId { get; set; }
    public string CsvListOfIds { get; set; }
}

稍后修改您的方法签名以接收该类的对象:

[HttpPost]
public List<User> GetUserList(UserListRequest obj)
{

    List<User> list = new List<User>();
    list.Add(new User { ID = obj.UserId });
    list.Add(new User { ID = obj.UserId + 1 }); //something
    return list;

}

记得使用[HttpPost]属性。还应该有一种发布方法,您可以注释掉Post控制器中已经提供的方法。(如果你想在你的控制器中有多个 post 方法,那么看看这个问题

您可以通过 jquery 或 Fiddler(或任何您想要的方式)发送请求。我用 Fiddler 对其进行了测试。您可能会看到如何通过 Fiddler 调试 Web API

设置好控制器后,构建项目并在调试模式下启动它。启动 Fiddler 并转到 composer。

将控制器的 URI (来自 IE/浏览器)粘贴到地址栏中,然后选择POST为 Http 方法。您的 URI 将类似于:

http://localhost:60291/api/values/GetUserList

在 Fiddler Composer -> Request Header 中指定

Content-Type: application/json

在 Fiddler Composer -> Request Body 中,指定您的 JSON

{
   "UserId": 1,
    "CsvListOfIds": "2,3,4,5"
}

(您也可以使用http://json2csharp.com/从 json 创建您的 C# 模板类)

在控制器中的方法上放置一个调试点,然后在 Fiddler HitExecute中,您将看到 Visual Studio 中的 Debug 点为 Hit 并且参数中填充了数据。 在此处输入图像描述

稍后您可以返回List<User>,您将在 Fiddler 中看到响应。

[{"ID":1},{"ID":2}]

暂时我创建了一个类User,如:

public class User
{
    public int ID { get; set; }
}

希望这可以帮助。

于 2013-09-06T17:20:48.513 回答
0

是的,差不多。在通过 POST 请求将其传递给控制器​​之前,在 javascript 中创建一个与 ViewModel (UserListRequest) 具有相同属性名称的 json 对象。当您有要传递给控制器​​的列表时,请使用 IEnumerable<>。在您的示例中,它可以IEnumerable<int>(为了类型安全)在您的 UserListRequest 类中用于 Id 列表。在 javascript 方面,它可以是一个数组。

编辑:得到

$.get(url, function (data) {
    var ids= (data.CsvListOfIds.split(','));        
});
于 2013-09-06T15:53:16.640 回答