C# Web API具有用于简单POST的空参数

C# Web API具有用于简单POST的空参数,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,我正在尝试使用Microsoft的Web API调用端点。我在尝试发布一个简单的字符串值时遇到了一个问题。下面是API控制器方法 [HttpPost] [Route("search")] public HttpResponseMessage Search([FromBody] string searchTerm) { // Code ommited for brevity. } 问题是searchTerm变量显示为null。以下是Fiddler对文章的原始视图: POST http:/

我正在尝试使用Microsoft的Web API调用端点。我在尝试发布一个简单的字符串值时遇到了一个问题。下面是API控制器方法

[HttpPost]
[Route("search")]
public HttpResponseMessage Search([FromBody] string searchTerm)
{
    // Code ommited for brevity.
}
问题是searchTerm变量显示为null。以下是Fiddler对文章的原始视图:

POST http://localhost:51889/search HTTP/1.1
Host: http://localhost:51889
Connection: keep-alive
Content-Length: 15
Cache-Control: no-cache
Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36
Postman-Token: 4fc51a0c-48ca-a1cd-3df8-70155c3cb5fc
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

searchTerm=dogs
我用邮递员发送请求。答案之一就是阅读。 Rick提到我需要包括[FromBody]属性,我确实包括了这个属性。然而,这并不能解决这个问题。我能做的唯一一件事就是创建一个这样的新类

[HttpPost]
[Route("search")]
public HttpResponseMessage Search([FromBody] Search term)
{
    // Code ommited for brevity.
}

public class Search
{
    public string Term { get; set; }
}

我宁愿不必为每个帖子创建像这样简单类型的新类。我错过什么了吗?我需要做哪些更改才能让简单类型在不创建新类的情况下处理我的帖子?

尝试将content tye用作application/json,而不是application/x-www-form-urlencoded
还可以从post-metod参数中删除formbody,您需要确保发布为no-key的值,并且它只是以=

因此,不是:

searchTerm=dogs
它应该是公正的

=dogs

您只能有一个具有
[FromBody]
属性的参数

[HttpPost]
[Route("search")]
public HttpResponseMessage Search([FromBody] string term, 
                                 [FromBody] string category // this wouldn't work)
{
    // Code ommited for brevity.
}
因此WebApi希望您拥有key:
=dogs
。 因此,如果您使用jQuery调用它,那么您需要使用如下内容:
$.post('api/test/search',{'':'dogs'})

编辑:

资源:


  • 您可以使用如下所示的模型绑定来获取所有参数值 创建viewmodel类,如下所示:

     public class SearchView 
        {
            public string SearchText { get; set; }               
        }
    
    [Route("api/Search"), HttpPost]
                public HttpResponseMessage Search(SearchView objSearchView)
                {
    
    在web api中添加上述视图模型类,如下所示:

     public class SearchView 
        {
            public string SearchText { get; set; }               
        }
    
    [Route("api/Search"), HttpPost]
                public HttpResponseMessage Search(SearchView objSearchView)
                {
    
    在js文件中传递它,如下所示:

    var objSearchView = {};
    objSearchView.SearchText  = "test";          
    
    $.ajax({
        url: '/api/search',
        type: 'POST',
        contentType: 'multipart/form-data',
        data: data,               
        success: function (response) {
        alert(response);
        },
        error: function (e) {
        alert(e);
        }
    });
    

    我将内容/类型更改为application/json,现在出现404错误“找不到与请求URI匹配的HTTP资源”。我还删除了FromBody属性。我可以看看你的邮政编码吗?您使用的是form post还是jquery post?我使用的是Postman来发出请求。这是一个chrome扩展。请尝试删除
    [FormBody]
    并在url上传递搜索词:
    search?searchTerm=mySearch
    Model binder解决此问题。From Body是完全错误的如果它完全按照它所说的做(将简单类型从http Body绑定到CLR类型),为什么它是完全错误的?如果我没有指定[FromBody],我会得到404,因为WebAPI默认绑定Uri中的简单类型。因为FromBody使用格式化程序,只允许一个参数。请提供代码示例ModelBinder属性如何修复此问题?因为如果我只是将[FromBody]更改为[ModelBinder](从System.Web.Http.ModelBinding)-我得到404.Oleksii-你是对的。我在考虑我们正在研究的即将发布的代码。不过,我将使用一个示例来启用此场景,并在这里发布。