【问题标题】:Empty data received in Post Method in WebApiWebApi 的 Post 方法中接收到的空数据
【发布时间】:2018-01-08 16:58:44
【问题描述】:

我有一个 WebApi,它以 Post 方法从我的网页接收数据: Api代码为:

public IHttpActionResult Post(PMSCost menu)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    if (menu.Price != 0)
                         return Ok(1);
                }
                catch (Exception ex)
                {
                    return BadRequest(ex.Message);
                }
            }
            return BadRequest(ModelState);
        }

而模型类代码是:

 public class PMSCost
    {
        public string CostName = "";
        public int Price = 0;
    }

我用代码调用 WebAPI:

var datatosend = new Object();
datatosend.CostName = "Foooooo";
datatosend.Price = 100;

jQuery.ajaxSetup({ async: true });
$.ajax({
    url: "/api/PMSCost/",
    type: "Post",
    data: datatosend,
    success: function (data) {
        if (data == "Success") {
            alert("Success");
        }
    },
});

Api 调用成功,但我发布到 Api 的 PMSCost 变量(菜单)始终为空值,例如 CostName= ""Price= 0

有人知道我的代码有什么问题吗?提前致谢

【问题讨论】:

  • 你用 HttpPost 属性装饰你的动作了吗?您可能还想分享如何将请求(使用例如 Fiddler)发送回服务器。
  • 不,我不装饰动作......我认为WebAPI通过方法名称知道动作,是我错了吗?
  • 这是等式的一部分,第二部分是动词。因此,将 [HttpPost] 添加到操作中,看看会发生什么。
  • 关于请求的方式...我只是在 Visual Studio 中运行我的网站并在 Post 和跟踪代码中设置断点...。
  • 在对 application/json 的 ajax 调用中设置请求的 contentType - 我认为默认是 form-url-encoded 并且它应该仍然有效,但我总是自定义它所以不确定。此外,浏览器开发工具中的网络选项卡通常就足够了,您不需要 fiddler 即可查看基本请求信息,但它会向您展示 jquery 实际发送数据的方式。

标签: c# ajax asp.net-web-api


【解决方案1】:

如果您要向操作发布数据,则必须添加[HttpPost] 属性:

[HttpPost]
public IHttpActionResult Post(PMSCost menu)
{
    if (ModelState.IsValid)
    {
        try
        {
            if (menu.Price != 0)
                 return Ok(1);
        }
        catch (Exception ex)
        {
             return BadRequest(ex.Message);
        }
    }

    return BadRequest(ModelState);
}

AJAX 请求如下;

var dataToSend = {
   CostName: "Foo",
   Price: 100         
};

$.ajax({
    url: "/api/PMSCost/",
    type: "POST",
    async:true,
    contentType: "application/json",
    data: JSON.stringify(dataToSend),
    success: function (data) {
        if (data == "Success") {
            alert("Success");
        }
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2019-01-16
    相关资源
    最近更新 更多