#ajax #asp.net-core #asp.net-ajax
#ajax #asp.net-core #asp.net-ajax
Вопрос:
Я переношу свой проект MVC на Core, и у меня возникли трудности с исправлением всех старых вызовов ajax.
Я могу передать параметры модели и строки в контроллер, однако целые числа у меня не работают.
Я могу обернуть их в объект JSON в виде строкового параметра, такого [FromBody]string objId
как в контроллере, но тогда я должен проанализировать значение int из Json {'objId' : 1}
.
Есть ли способ, которым я могу избежать этого и просто передать int?
ниже приведен код, который я пытаюсь.
[HttpPost]
public JsonResult PassIntFromView([FromBody]int objId)
{
//DO stuff with int here
}
вот js.
var data = { "objId": 1};
$.ajax({
url: '@Url.Action("PassIntFromView", "ControllerName")',
data: JSON.stringify(data),
type: "POST",
dataType: 'JSON',
contentType: "application/json",
success: function(data) {
//do stuff with json result
},
error: function(passParams) {
console.log("Error is " passParams);
}
});
objId
В контроллере всегда равно 0.
Я пробовал это, не делая JSON.stringify(data)
также безрезультатно.
Я также перепробовал все различные варианты атрибута form.
Комментарии:
1. У меня это работает: var data = 1; public IActionResult PassIntFromView([FromBody] int CaseID). Вы передаете только число, и вы можете передать ТОЛЬКО одну переменную в качестве параметра; int, string, boolean и т.д. Как только вы добавите дополнительные параметры, они должны быть обернуты в модель на стороне контроллера.
Ответ №1:
Попробуйте использовать ContentType как 'application/x-www-form-urlencoded'
:
var data = { objId: 1 };
$.ajax({
url: '@Url.Action("PassIntFromView", "ControllerName")',
type: "post",
contentType: 'application/x-www-form-urlencoded',
data: data,
success: function (result) {
console.log(result);
}
});
Затем удалите [FromBody]
атрибут в контроллере
[HttpPost]
public JsonResult PassIntFromView(int objId)
{
//Do stuff with int here
}
Комментарии:
1. Почему он работает с «application / x-www-form-urlencoded», а не с «application / json»? Это из-за какой-то конфигурации?
2. кто-нибудь знает ответ на вопрос @chunk1ty?
3. Я думаю, что это при запуске. Мой настроен на
services.AddMvc().AddJsonOptions(o => { o.JsonSerializerOptions.PropertyNamingPolicy = null; o.JsonSerializerOptions.DictionaryKeyPolicy = null; });
вvoid ConfigureServices(IServiceCollection services)
соответствии с методом
Ответ №2:
Я полагаю, что ваша проблема может заключаться в том, что вы передаете объект в api, но пытаетесь превратить его в примитив. Я знаю, что уже есть выбранный ответ, но дайте этому ход.
var data = { };
data["objId"] = 1; //I just wanted to show you how you can add values to a json object
$.ajax({
url: '@Url.Action("PassIntFromView", "ControllerName")',
data: JSON.stringify(data),
type: "POST",
dataType: 'JSON',
contentType: "application/json",
success: function(data) {
//do stuff with json result
},
error: function(passParams) {
console.log("Error is " passParams);
}
});
Вы создаете класс модели
public class MyModel {
public int ObjId {get;set;}
}
Ваш контроллер должен ожидать одно из этих
[HttpPost]
public JsonResult PassIntFromView([FromBody] MyModel data)
{
//DO stuff with int here
}
Комментарии:
1. Да, это работает для меня, но я хотел сделать это без необходимости оборачивать примитив в модель. Но если кто-то хочет передать модель, это отличный пример!
2. Скопируйте это. Я был на волне повышения голосов и нашел этот вопрос. Подумал, что я бы попробовал.
Ответ №3:
В JSON предпочтение отдается строкам, а не целым числам. Вам лучше использовать JSON.stringify (данные) для синтаксического анализа на вашем контроллере, преобразовать это в целое число в контроллере, затем проанализировать строку, которая была возвращена как:
var data = { objId: 1};
$.ajax({
url: '@Url.Action("PassIntFromView", "ControllerName")',//asp.net - url: 'api/controllerName/controllerFunction'
data: JSON.stringify(data),
type: "POST",
dataType: 'JSON',
contentType: "application/json",
success: function(data) {
var result = JSON.parse(data);
//do stuff with json result
},
error: function(passParams) {
console.log("Error is " passParams);
}
});
Ответ №4:
Попробуйте это:
var data = { "objId": 1};
$.ajax({
url: '@Url.Action("PassIntFromView", "ControllerName")',
data: data,
type: "POST",
dataType: 'JSON',
contentType: "application/json",
success: function(data) {
//do stuff with json result
},
error: function(passParams) {
console.log("Error is " passParams);
}
});
Ваш контроллер:
[HttpPost]
public JsonResult PassIntFromView(int objId)
{
//DO stuff with int here
}
Комментарии:
1. для меня это все равно вернет 0.
Ответ №5:
Js
var data = { "objId": 1};
$.ajax({
url: "ControllerName/PassIntFromView",
data: data,
type: "POST",
dataType: 'JSON',
success: function(data.result!=null) {
console.log(data.result);
},
error: function(passParams) {
console.log("Error is " passParams);
}
});
Комментарии:
1. [HttpPost] общедоступный IActionResult PassIntFromView (int ObjId) { }
2. при этом я по-прежнему получаю свой ObjId как 0.
Ответ №6:
Выбранный ответ у меня не сработал, сработало то, что я построил целое число непосредственно в js. Поэтому измените только data: JSON.stringify(data),
на data: JSON.stringify(1),
в своем коде.
Ответ №7:
Я заставил его работать следующим образом
let numberFour = JSON.stringify(4);
$.ajax({
.......
.......
data: numberFour,
type: "POST",
dataType: 'JSON',
contentType: "application/json",
......
........
});