2

背景

我正在使用 MVC 4 Web API 项目 (ASP.NET) 在 C# 中编写 API 层。

我在我的控制器中编写了一个测试操作,如下所示:

[System.Web.Mvc.HttpPost]
public string TestAction(FormCollection fc)
{
    return "test";
}

我在 FireFox 中使用 Poster 来测试表单帖子:

  • 内容类型设置为 application/x-www-form-urlencoded
  • 参数中的正文设置为 foo=bar&bar=foo

这是我的路线:

RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}/{action}");

问题

从 Poster 发布 url 和参数时,我可以毫无问题地点击控制器,但是如果我放置一个断点return "test";然后将鼠标悬停在FormCollection传入的 ( fc) 上,则表明传入的是一个空的字符串数组而不是我的价值观(例如string[0])。

我已经在客户端上使用 jQuery 完成了很多次$.post(),接收表单集合没有问题。

在这种情况下它失败了什么?

谢谢,

马特

4

1 回答 1

8

似乎这是在 API 控制器 ( ApiController) 中定义的操作。如果是这种情况,您不能使用FormCollection. 这用于正常的控制器操作,而不是 API 控制器(我个人即使在正常的控制器操作中也不使用它,但这是另一个主题,请参阅下一段以了解我使用的是什么)。

您应该定义一个视图模型:

public class MyViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

然后让您的控制器操作将此视图模型作为参数:

public class TestController: ApiController
{
    [System.Web.Http.HttpPost]
    public string TestAction(MyViewModel model)
    {
        return "test";
    }
}

请注意,API 控制器的正确属性[System.Web.Http.HttpPost][System.Web.Mvc.HttpPost]您的代码中的属性不同。

另外,我建议您遵守 RESTful 约定:

RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}");

接着:

public class TestController: ApiController
{
    public string Post(MyViewModel model)
    {
        return "test";
    }
}

现在 HTTP 动词(在这种情况下为 POST)确定要调用的控制器操作:

POST /test
Server: http://example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
Connection: close

foo=bar&bar=foo
于 2012-10-18T16:43:04.543 回答