DELETE not working in API REST Controller DotNet Core
DELETE not working in API REST Controller DotNet Core
DiabloRito
Posts: 11Questions: 3Answers: 1
Hello,
Create and Edit buttons are working, but Delete button simply doesn't do anything.
I found some issues on the website with the same problem but surely not the same cause.
my code is quite simple taken from the dotnet demo.
html :
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-body" style="overflow-x:auto;">
<table id="articles" class="table table-striped table-bordered">
<thead>
<tr>
<th>Article</th>
</tr>
</thead>
</table>
</div>
</div>
</div>
</div>
javascript:
function articles_create_editor() {
var editor = new $.fn.dataTable.Editor({
"ajax": {
"create": {
type: 'POST',
url: get_server_api() + "articles" + '/api/rest/create/'
},
"edit": {
type: 'PUT',
url: get_server_api() + "articles" + '/api/rest/edit/'
},
"remove": {
type: 'DELETE',
url: get_server_api() + "articles" + '/api/rest/remove/'
}
},
"table": "#articles",
"fields": [{
"label": "article:",
"name": "article"
}
]
});
return editor;
}
function articles_create_table(editor)
{
var table = $('#articles').DataTable({
dom: "Bfrtip",
ajax: get_server_api() + "articles" + '/api/rest/get',
serverSide: true,
columns: [
{ data: "article" }
],
select: true,
buttons: [
{ extend: "create", editor: editor },
{ extend: "edit", editor: editor },
{ extend: "remove", editor: editor }
]
});
return table;
}
$(document).ready(function ()
{
editor = articles_create_editor();
table = articles_create_table(editor);
});
C#.NET :
private dynamic Rest(HttpRequest request)
{
using (var db = new Database("sqlserver", Application.singleton.connection_string))
{
var response = new Editor(db, "articles")
.Model<Article>()
.Field(new Field("article"))
.Debug(true)
.Process(request)
.Data()
;
// return response or return JsonResult(response) throws error
var result = new JsonResult(new {
//cancelled = response.cancelled,
data = response.data,
debug = response.debug,
//draw = response.draw,
//error = response.error,
//fieldErros = response.fieldErrors,
files = response.files,
//id = response.id,
//meta = response.meta,
options = response.options,
//recordsFiltered = response.recordsFiltered,
//recordsTotal = response.recordsTotal,
//upload = response.upload
});
return result;
}
}
[Route("articles/api/rest/get")]
[HttpGet]
public dynamic Get()
{
return Rest(Request);
}
[Route("articles/api/rest/create")]
[HttpPost]
public dynamic Create()
{
return Rest(Request);
}
[Route("articles/api/rest/edit")]
[HttpPut]
public dynamic Edit()
{
return Rest(Request);
}
[Route("articles/api/rest/remove")]
[HttpDelete]
public dynamic Remove()
{
return Rest(Request);
}
what i have in the debug is this request :
SELECT [id] as 'id', [article] as 'article' FROM [articles]
which is surprising because when i execute the code step by step it goes correctly throw the Remove method.
In the request object i can see this :
```
Any idea about that ?
Replies
You will probably need to set the
ajax.deleteBody
option. Not all HTTP servers support body parameters in DELETE requests (the HTTP spec says it is optional) - I honestly can't remember if IIS is one of those or not, but that would be the first thing to do.Regards,
Allan
Hello @allan,
I tested both options "deleteBody" but nothing changed at all.
When i see the debug field in a create or update request, i find a create or an update query.
However for the remove request, i can see only a select request. question is why ?
I found the solution using postman :
I had to select "body" then "form-data" then set the following parameters :
data[row_18][DT_RowId]:row_18
data[row_18][article]:aaa
action:remove
So it seems "body" is not enough, because in "body" there are many options. It should be "form-data".
Is there an equivalent way using datatables/editor to send remove request using body/form-data ? (because it's working correctly using postman, without postman the remove request is processed as a select request it seems because no parameter is binded i suppose).
actually using visual studio debugger i can see that the field "form" in "Request" object is throwing an exception :
((Microsoft.AspNetCore.Http.DefaultHttpRequest)request).Form '((Microsoft.AspNetCore.Http.DefaultHttpRequest)request).Form' threw an exception of type 'System.InvalidOperationException'
so data are not mapped to form data, only to query string, even if i set deleteBody to false.
any idea to solve that ?
actually deleteBody: false solved the problem. I had just to delete cache from my browser. thanks
No worried - good to hear that has sorted it!
Allan