параметр ajax POST int в asp.net ядро

#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",
    ......
    ........
});