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

时间:2012-10-18 16:41:00

标签: 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";
}

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

  • content-type设置为application / x-www-form-urlencoded
  • 来自参数的正文设置为foo = bar& bar = foo

这是我的路线:

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

问题

我可以在发布网页上的网址和参数时轻松点击控制器,但是如果我在return "test";上放置一个断点,然后将鼠标悬停在传入的FormCollection上({ {1}})它显示传入一个空数组的字符串而不是我的值(例如fc)。

我已经在客户端上使用jQuery string[0]完成了这么多次,没有收到表单集的问题。

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

谢谢,

马特

1 个答案:

答案 0 :(得分:7)

这似乎是在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 Verb(本例中为POST)确定要调用的控制器操作:

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

foo=bar&bar=foo