【问题标题】:Sending data from DataTables to Web API controller using POST method使用 POST 方法将数据从 DataTables 发送到 Web API 控制器
【发布时间】:2017-08-01 09:19:52
【问题描述】:

我尝试使用 Web API 为 DataTables 进行服务器端处理。我的 Web API 控制器中有两个具有相同参数列表的操作:

public class CampaignController : ApiController
{
    // GET request handler
    public dtResponse Get(int draw, int start, int length)
    {
        // request handling
    }

    // POST request handler
    public void Post(int draw, int start, int length)
    {
        // request handling
    }
}

如果我使用 GET 方法向服务器发送 AJAX 请求,Get 操作将被激活。但是,如果我使用 POST 方法,则不会激活任何操作。 我试图将 POST 处理程序签名更改为

public void Post([FromBody]object value)
{
    // request handling
}

在这种情况下,value 是null。请注意,HttpContext.Current.Request.Form 集合不为空。此集合中存在 draw、start、length 变量。因此,我认为问题在于模型绑定,但我无法修复它。请帮帮我。

【问题讨论】:

  • POST 端点不适合多个参数。使用绑定对象。我看到你在下面的 sn-p 中改变了它。使用具体类型:类图、道具绘制、道具开始、道具长度。
  • 另外添加动词属性[HttpPost],[HttpGet]帮助设计/构建一个restful API
  • @TezWingfield,我尝试添加动词属性,但没有任何结果。

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


【解决方案1】:

不知道具体发生了什么,但似乎缺少一些元素。我今天早上写了Post endpoint,希望能帮助你朝着正确的方向前进。

还要注意如果你想要“数据”使用Get,如果你插入数据然后POST

        [HttpPost]
        [Route("orders")]
        public async Task<IHttpActionResult> Post([FromBody]List<Models.Model.Order> orders)
        {

            if (orders == null)
                return BadRequest("Unusable resources.");

            if (validatedOrders.Count <= 0)
                return BadRequest("Unusable resources.");

            try
            {
                //Create abstracted Identity model to pass around layers
                var identity = User.Identity as ClaimsIdentity;

                var identityModel = IdentityModel.Create(identity);
                if (identityModel == null)
                    return StatusCode(HttpStatusCode.Forbidden);

                var response =  await _orderService.AddAsync(validatedOrders, identityModel);
                return Ok(response);
            }
            catch (System.Exception ex)
            {
                return InternalServerError();
            }
            finally
            {
                _orderService.Dispose();
            }
        }
  • 使用 IHttpActionResult 会暴露响应的返回
  • 动词属性有助于构建/设计 Restful API 等 姓名签名
  • 属性路由保存配置中的写入并更改路由 班级

总结一下,将订单集合替换为:

public sealed class Diagram
{
  public int Draw { get; set; } 
  public int Start { get; set; } 
  public int Length { get; set; }
}

重写验证,删除身份创建,删除插入和删除/替换属性路由。

使用 HttpContext.Current.Request.Form 尝试从中构建一个 Diagram object 并传递它。

或者也可以传入form collection

 [HttpPost]
 [Route("something")]
 // POST api/<controller>
 public async Task<HttpResponseMessage> Post(FormDataCollection form)
 {
     string tid = form.Get("tid");
     string sid = form.Get("sid");
     string userid = form.Get("userid");
     string udid = form.Get("udid");

  }

DataTable 文档中的其他资源 Git Hub Repo

【讨论】:

  • 空间类 Diagram 和 [FromBody] 属性帮助了!非常感谢!!!
【解决方案2】:

这个呢:

[HttpPost]    
public void Post([FromBody]int draw, [FromBody]int start, [FromBody]int length)
{
    // request handling
}

【讨论】:

  • [FromForm] 属性会导致编译错误。只有 [FromBody] 和 [FromUri] 有效。 [FromForm] 属性的命名空间是什么?
  • [FromForm] 用于 Dot Net 核心。如果您使用的是较旧的 .NET [FromBody] 应该可以工作(更新答案)
  • 谢谢,但是 [FromBody] 并没有解决问题。
  • 我很确定你不能有多个“[FromBody]”违背了来自请求正文的目的
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
相关资源
最近更新 更多