【问题标题】:Collection is returning null in ASP.NET WebApi集合在 ASP.NET WebApi 中返回 null
【发布时间】:2016-04-06 13:06:34
【问题描述】:

我正在使用 ASP.NET WebApi 2.0 我已在本地服务器上发布它并尝试使用这些服务

这就是我的 Api 控制器的外观

public class TestController : ApiController
{
    public List<string> names = new List<string>();
    public String Get()
    {
        return "Hello I am Service";
    }

    public IEnumerable<string> Post([FromBody]string custName)
    {
        try
        {

            names.Add(custName);
            return names;
        }
        catch(Exception ex)
        {
            return null;
        }           
    }
}

我正在使用 jQuery AJAX 发布值,如下所示

var customerName = $('#txtName').val();

$.ajax(
{
 url:"http://myip:8060/Api/Test",
 method:"POST",
 data:{'custName',customerName},
 success:function(data)
 {
  console.log(data);
 }
error:function(e)
{
 console.log(e);
}
})

现在,如果我提醒 customerName,我会得到正确的值,但是当我返回控制器的 Post 操作时返回 null,如下所示

[null]
[null,null] 

我的问题是为什么这些值会为空?

【问题讨论】:

标签: c# jquery asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

在 jQuery 中试试这个:

var customerName = $('#txtName').val();

$.ajax(
{
 url:"http://myip:8060/Api/Test",
 method:"POST",
 data:JSON.stringify({'custName':customerName}),
 success:function(data)
 {
  console.log(data);
 }
error:function(e)
{
 console.log(e);
}
})

【讨论】:

  • 已检查但仍返回 null
【解决方案2】:

试试这个:-

    var customerName = $('#txtName').val();

      $.ajax(
     {
      url:"http://myip:8060/Api/Test", 
      method:"POST",
      data: { custName: customerName },
      success:function(data)
      {
       console.log(data);
      }
      error:function(e)
      {
       console.log(e);
      }
    })

【讨论】:

  • 如果你的意思是在传递 custName 时我应该删除引号,然后我检查了它但没有任何区别.. data: { custName: customerName }data: { 'custName': customerName }
  • 我已经提供了所有需要的操作和 jQuery ajax 调用
【解决方案3】:

hmm 控制器在尝试执行发布请求时以某种方式给出了错误。 在你的控制器中试试这个:

public List<string> Post()//[FromBody]string custName)
    {
        HttpContent requestContent = Request.Content;
        string custName = requestContent.ReadAsStringAsync().Result;

        try
        {

            names.Add(custName);
            return names;
        }
        catch (Exception ex)
        {
            List<string> errors = new List<string> {ex.Message};
            return errors;
        }



    }

我使用的html如下:

    <!DOCTYPE html>

<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
</head>
<body>
First name: <input type="text" id="demo2" onkeyup="showitemresult()" ><br>
    result name: <input type="text" id="demo" ><br>
</body>
</html>
<script>
    function showitemresult() {
        var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function () {
            if (xhttp.readyState == 4 && xhttp.status == 200) {
                document.getElementById("demo").value = xhttp.responseText;
            }
        };
        xhttp.open("POST", "http://localhost:52016/api/values", true);
        xhttp.send(document.getElementById("demo2").value);
    }
</script>

http://localhost:52016/api/values 更改为您的地址 编辑2:我注意到js不是jquery。但我得到了这个工作。

【讨论】:

  • 已检查,但不是返回 null,而是返回 [" "], [" "," "]
  • 不,onkeyUp 事件我收到操作错误不支持的媒体类型(405)
  • 嗯,你也复制了控制器吗?我得到了在这里工作的代码。您的地址将类似于 localhost:xxxxx/api/test
【解决方案4】:

ASP.NET Web API 的模型绑定器无法将 JSON 转换为字符串,您必须使用对象来执行此操作。

所以你有 3 个选项来解决你的问题

首先,使用查询字符串

在您的操作中将属性FromBody 更改为FromUri,就像这样

public IEnumerable<string> Post([FromUri]string custName)
{
    try
    {
        names.Add(custName);
        return names;
    }
    catch (Exception ex)
    {
        return null;
    }
}

然后更改您的 javascript 代码

$.post("/Api/Test/?custName=" + customerName, function(data) {
    console.log(data);
}).error(function(e) {
    console.log(e);
});

二、使用路由属性

使用类似的 Route 属性装饰您的操作

[Route("api/test/{custName}")]
public IEnumerable<string> Post([FromUri]string custName)
{
    try
    {
        names.Add(custName);
        return names;
    }
    catch (Exception ex)
    {
        return null;
    }
}

然后更改您的 javascript 代码

$.post("/Api/Test/" + customerName, function(data) {
    console.log(data);
}).error(function(e) {
    console.log(e);
});    

Obs.:要使用Route属性,你必须在WebApiConfig中配置它,所以你必须有这行:

config.MapHttpAttributeRoutes();

所以你的 WebApiConfig 应该是这样的

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

三、使用视图模型类

创建一个类

public class ViewModel
{
    public string custName { get; set; }
}

使用 FromBody 属性在您的操作中接收此模型

public IEnumerable<string> Post([FromBody]ViewModel viewModel)
{
    try
    {
        names.Add(viewModel.custName);
        return names;
    }
    catch (Exception ex)
    {
        return null;
    }
}

然后更改您的 javascript 代码

$.post("/Api/Test/", { custName: customerName }, function(data) {
    console.log(data);
}).error(function(e) {
    console.log(e);
});

Obs.: 你的控制器有一个小错误

public class TestController : ApiController
{
    public List<string> names = new List<string>();

    public string Get()
    {
        return "Hello I am Service";
    }

    //Rest of code
}

Web API 和 MVC 中的每个控制器都是在每次服务器处理请求时创建的,因此如果您想保留,TestController 类中的 names 字段将是每个请求中的一个新列表此列表中的数据其他请求,将其设为静态

public static List<string> names = new List<string>();

【讨论】:

  • @Alberto..我应该对你说什么......再次真诚的感谢...... High-5
  • @Alerto..只有一件事要检查它有什么不同以及如何[FromBody] & [FromUri]
  • @Chetan FromUri 尝试从查询字符串的 URL 中获取数据,例如 www.youtube.com/?w=videocodeFromBody 尝试从您在服务器中收到的 HTTP 请求的正文中获取数据。
  • 这是我几周前问过的 1 个问题,但没有得到正确的答案,请您看一次stackoverflow.com/questions/34243111/…
  • 你能看看这个吗,我有点急这个要求。stackoverflow.com/questions/34774473/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2020-09-04
相关资源
最近更新 更多