45

自从我将 MVC4 webapi beta 更新为 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>
4

1 回答 1

95

当您想发布“简单”值时,Web.API 有点挑剔。

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

[HttpPost]
public string Test([FromBody] string output)
{
    return output;
}

通过此更改,您将不再获得 404,但output将始终为空,因为 Web.Api 需要以特殊格式发布的值(查找 Sending Simple Types 部分):

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

=value

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

所以建议你应该创建一个模型类型:

public class MyModel
{
    public string Output { get; set; }
}

[HttpPost]
public string Test(MyModel model)
{
    return model.Output;
}

然后它将与您的示例一起使用,而无需修改您的视图。

于 2012-09-02T15:59:50.230 回答