Asp.net mvc 4 找不到担任职务的简单控制器

Asp.net mvc 4 找不到担任职务的简单控制器,asp.net-mvc-4,asp.net-web-api,forms,Asp.net Mvc 4,Asp.net Web Api,Forms,自从我将MVC4 webapi测试版更新为RC以来,我已经提出了一些问题,请求帮助解决这些问题。我现在已经把一切都安排好了,但还有一件事我还不知道原因 对于这个简单的控制器,我有一个接受POST的控制器和一个接受GET的控制器。当我试图通过从HTML表单发送请求来运行它们时,只找到GET控制器,而POST控制器将返回以下错误 { "Message": "No HTTP resource was found that matches the request URI 'http://localh

自从我将MVC4 webapi测试版更新为RC以来,我已经提出了一些问题,请求帮助解决这些问题。我现在已经把一切都安排好了,但还有一件事我还不知道原因

对于这个简单的控制器,我有一个接受POST的控制器和一个接受GET的控制器。当我试图通过从HTML表单发送请求来运行它们时,只找到GET控制器,而POST控制器将返回以下错误

{
  "Message": "No HTTP resource was found that matches the request URI 'http://localhost/webapi/api/play/test'.",
  "MessageDetail": "No action was found on the controller 'Play' that matches the name 'test'."
}
为什么找不到POST控制器

控制器

public class PlayController : ApiController
{
    [HttpPost]  // not found
    public string Test(string output)
    {
        return output;
    }

    [HttpGet]  // works
    public string Test2(string output)
    {
        return output;
    }
}
HTML表单

<form action="http://localhost/webapi/api/play/test" method="post">
<input type="text" name="output" />
<input type="submit" name="submit" />
</form>

<form action="http://localhost/webapi/api/play/test2" method="get">
<input type="text" name="output" />
<input type="submit" name="submit" />
</form>

Web.API在发布“简单”值时有点挑剔

您需要使用
[FromBody]
属性来表示该值不是来自URL,而是来自发布的数据:

[HttpPost]
公共字符串测试([FromBody]字符串输出)
{
返回输出;
}
通过此更改,您将不再获得404,但
输出将始终为空,因为Web.Api要求在中发布值(请查找发送简单类型部分):

其次,客户端需要以以下格式发送值:

=值

具体来说,对于简单类型,名称/值对的名称部分必须为空。并非所有浏览器都支持HTML表单的这种功能, 但您在脚本中创建此格式

因此,建议您创建一个模型类型:

公共类MyModel
{
公共字符串输出{get;set;}
}
[HttpPost]
公共字符串测试(MyModel)
{
返回模型。输出;
}

然后,它将在不修改您的视图的情况下与您的示例FROM一起工作。

如果我能在3年后插话,谢谢!!这解决了一个我花了几个小时才解决的问题。这正是SO的意义所在。当webApiConfig.cs和控制器中的过程之间的参数名不匹配时,我也遇到了同样的错误。