Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的控制器中的FormCollection是空的? 背景_C#_Asp.net Mvc_Post_Asp.net Mvc 4 - Fatal编程技术网

C# 为什么我的控制器中的FormCollection是空的? 背景

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

我正在使用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=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
,该怎么办?固定的模型类型不起作用。