我有一个在Web API Web服务中使用的ViewModel。
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
然后我有一个ApiController,其方法如下:
[Route("api/Customer/{Id}")]
public IHttpActionResult Post(int Id, [FromBody]Customer Customer)
{
...Add to db, Id also exists in Customer
return Ok();
}
客户ID在URI中可用 - 但Customer对象包含客户ID - 可以将其传递到帖子中。
这似乎是多余的 - 并且可能导致ID被放错地方。
什么是最佳做法?如果我需要从客户机构中删除Id,我该怎么办?
参考 - “将HTTP动词与任务资源一起使用” - REST成熟度模型中的第2级 - 声明应在URI中传递Id以更新或插入具有Id的任务:
答案 0 :(得分:0)
我们通常会在尝试创建新记录时调用 POST 方法,在您的情况下为“Customer”, PUT 方法为< strong>更新现有记录。但这不是强制性的。您也可以使用POST方法创建和更新现有记录。
通常,我们将自动生成的字段设置为表的Id(主键)字段。这意味着,当我们尝试添加记录时,我们不需要传递Id字段的数据。在这种情况下,您不需要在URI中传递Id,也不需要在API POST方法中为Id编写参数。
所以你的ajax方法就像这样,
$.ajax({
url: 'myURL',
type: "json",
contentType: 'application/json; charset=utf-8',
data: myFormData,
success: function(data)
{
alert("success");
}
})
如上所述,您可以使用相同的方法(POST)添加新记录或编辑现有记录,那么这怎么可能呢?
我假设您在数据参数中的ajax代码中传递了Id值。
所以你的API Post方法就是这样,
[Route("api/Customer")] // I removed Id here
public IHttpActionResult Post([FromBody]Customer Customer)
{
if(Customer!=null && Customer.Id==0) //You can check Id with null value
{
// Add a new record to Customer
}
else
{
// fetch Customer data by Customer.Id and update here
}
return Ok();
}
就这么简单。但是,您可以使用PUT方法编写此更新代码。
但是如果你在POST方法中将值传递给Id字段(这不是自动生成的字段),那么你也可以从POST方法中删除Id参数,你的路线就像此,
[Route("api/Customer")]
希望有所帮助:)