为什么控制器中的FormCollection为空?

Mat*_*att 2 c# asp.net-mvc post asp.net-mvc-4

背景

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

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

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

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

  • content-type设置为application/x-www-form-urlencoded
  • 参数的主体设置为foo = bar&bar = foo

这是我的路线:

RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}/{action}");
Run Code Online (Sandbox Code Playgroud)

我可以张贴从海报的URL和参数时没有问题,达到控制,但如果我把一个断点return "test";,然后将鼠标悬停在FormCollection在(传递fc),它表明字符串空数组中获得通过,而不是我的价值观(例如string[0]).

我已经$.post()在客户端使用jQuery完成了这么多次,没有收到表单集合的问题.

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

谢谢,

马特

Dar*_*rov 7

看来这是在API控制器(ApiController)中定义的动作.如果是这种情况你不能使用FormCollection.这用于正常的控制器操作,而不是API控制器(我个人不会在正常的控制器操作中使用它,但这是另一个主题,请参阅下一段以了解我正在使用的内容).

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

public class MyViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

另外我建议你坚持使用RESTful约定:

RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}");
Run Code Online (Sandbox Code Playgroud)

然后:

public class TestController: ApiController
{
    public string Post(MyViewModel model)
    {
        return "test";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,HTTP Verb(在本例中为POST)确定要调用的控制器操作:

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

foo=bar&bar=foo
Run Code Online (Sandbox Code Playgroud)