我正在使用MVC 4 Web API项目(ASP.NET)在C#中编写API层。
我在我的控制器中写了一个测试动作,如下所示:
[System.Web.Mvc.HttpPost]
public string TestAction(FormCollection fc)
{
return "test";
}
我在FireFox中使用Poster测试表单帖子:
这是我的路线:
RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}/{action}");
我可以在发布网页上的网址和参数时轻松点击控制器,但是如果我在return "test";
上放置一个断点,然后将鼠标悬停在传入的FormCollection
上({ {1}})它显示传入一个空数组的字符串而不是我的值(例如fc
)。
我已经在客户端上使用jQuery string[0]
完成了这么多次,没有收到表单集的问题。
在这种情况下失败了什么?
谢谢,
马特
答案 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