【问题标题】:MVC Web API post an array of integers via x-www-form-encodedMVC Web API 通过 x-www-form-encoded 发布一个整数数组
【发布时间】:2014-10-12 11:13:38
【问题描述】:

我正在尝试做一些我认为相当简单的事情。我有一个 HTML 表单,它发布一组整数输入,都称为“级别”:

<form action="/api/levels" method="post">
<input name="Level" value="10" />
<input name="Level" value="20" />
<input name="Level" value="30" />
<button type="submit">submit</button>
</form>

我正在尝试将其接收到这样的 MVC Web API 控制器方法中:

public void Post(int[] Level)
{

}

使用 Chrome 的网络工具进行诊断确认请求包含我所期望的表单数据:

Level=10&Level=20&Level=30

问题是Level参数总是为null。我显然希望它是一个包含 3 个值 10、20 和 30 的元素的数组。

有很多关于类似事情的帖子,但我找不到任何关于 Web API 模型绑定而不是 MVC 的帖子,或者那些似乎在抱怨旧版本候选版本中所做更改的帖子。

有人可以指点我正确的方向吗?

【问题讨论】:

    标签: asp.net-web-api


    【解决方案1】:

    如果你想绑定body Level=10&amp;Level=20&amp;Level=30,你需要你的action方法参数是这样的。

    public HttpResponseMessage Post(MyClass c)
    {
        // Use c.Level array here
    }
    
    public class MyClass
    {
        public int[] Level { get; set; }
    }
    

    相反,如果您希望操作方法参数为int[] Level,您的HTTP 消息必须是这样的。

    POST http://server/api/levels HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 11
    
    =10&=20&=30
    

    为此,有这样的形式。

    <form action="/api/levels" method="post">
        <input name="" value="10" />
        <input name="" value="20" />
        <input name="" value="30" />
        <button type="submit">submit</button>
    </form>
    

    之所以如此怪异,是因为 ASP.NET Web API 将整个主体绑定到一个参数中。

    【讨论】:

    • 感谢您的回复,不得不使用未命名的表单变量似乎是一种非常骇人听闻的方式。 Web API 真的不能以更简洁的方式处理这个问题吗?
    • 我刚刚挖掘了一些 MVC 单元测试,发现一个测试正是你的答案所说的,所以 a)谢谢你 b)微软你在想什么! aspnetwebstack.codeplex.com/SourceControl/latest#test/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2021-01-04
    • 2018-01-31
    • 2022-09-28
    相关资源
    最近更新 更多