C# 为什么我的控制器中的FormCollection是空的? 背景
我正在使用MVC4WebAPI项目(ASP.NET)在C#中编写一个API层 我在控制器中编写了一个测试操作,如下所示:C# 为什么我的控制器中的FormCollection是空的? 背景,c#,asp.net-mvc,post,asp.net-mvc-4,C#,Asp.net Mvc,Post,Asp.net Mvc 4,我正在使用MVC4WebAPI项目(ASP.NET)在C#中编写一个API层 我在控制器中编写了一个测试操作,如下所示: [System.Web.Mvc.HttpPost] public string TestAction(FormCollection fc) { return "test"; } 我正在使用FireFox中的Poster测试表单帖子: 内容类型设置为application/x-www-form-urlencoded 参数中的Body设置为foo=bar&bar=fo
[System.Web.Mvc.HttpPost]
public string TestAction(FormCollection fc)
{
return "test";
}
我正在使用FireFox中的Poster测试表单帖子:
- 内容类型设置为application/x-www-form-urlencoded
- 参数中的Body设置为foo=bar&bar=foo
RouteTable.Routes.MapHttpRoute("PostDefault", "{controller}/{action}");
问题:
当我从海报中发布url和参数时,我能够毫无问题地点击控制器,但是如果我在返回“test”上设置断点
然后将鼠标悬停在传入的表单集合上(fc
),它显示传入的是空字符串数组,而不是我的值(例如string[0]
)
我在客户端上使用jQuery$.post()
多次这样做,在接收表单集合时没有遇到任何问题
在这种情况下,它失败了什么
谢谢
Matt这似乎是API控制器()中定义的操作。如果是这种情况,则不能使用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
谢谢,这很有效。在我的API层中,我只是简单地接受来自一个应用程序的请求,然后将该请求传递给一个单独的服务,因此我的层实际上只是一个传递(说来话长)。遗憾的是,我必须建立一个模型来传递这些请求,因为如果模型在任意一端发生变化,将来可能会导致问题。当然,这不是对你答案的评论。我感谢你的帮助@Darin——有没有理由不使用HttpContext.Current.Request.Form
来获取表单参数,而不必设置显式模型?我刚刚尝试过,效果非常好,但我想知道您是否有充分的理由不提及此方法(例如性能考虑)。谢谢HttpContext.Current
=>忘记单元测试。更不用说Web API也可以自托管。如果您自己托管它HttpContext.Current
不再存在,您的代码将中断。@DarinDimitrov但是如果我有一个控制器操作需要进行更动态的输入,比如C中的params object[]
,或者C中的varargs
,该怎么办?固定的模型类型不起作用。