JsonResult принимает только первый параметр и игнорирует остальные - PullRequest
0 голосов
/ 17 октября 2018

У меня странная проблема, которая выше моего уровня, я безуспешно пытался ее устранить.

Я занимаюсь разработкой простого приложения MVC и использую ajax для отправки данных из представления вконтроллер.По какой-то причине контроллер распознал только первые параметры, а остальные просто нулевые.Я даже пытался поместить фиксированные строки вместо переменных, но они по-прежнему отображаются как нулевые на контроллере ???

Вид:

  $.ajax({
        type: "POST",
        url: "../Home/AddItem",
        data: "{ItemModel: 'ttt1', ItemName: 'ttt2'}",
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (data) {
            console.log(JSON.stringify(data));
            if (data.Success == "Success") {
                alert("Item has been added.");
            } else {
                alert("We were not able to create the offer");
            }
        },
        error: function (exception) {                
            console.log(exception);
        }
    });

На контроллере Home у меня есть действие ниже:

[HttpPost]
    public JsonResult AddItem(string ItemModel, string ItemName)//ItemName is always null??
    {
        try
        {
            _DB.Database.ExecuteSqlCommand(@"INSERT INTO ITEMS(iModel, iName) VALUES ({0}, {1})", ItemModel, ItemName);
            return Json(new { Success = "Success" });
        }
        catch (Exception ex)
        {
            throw ex;
        }            
    }

1 Ответ

0 голосов
/ 17 октября 2018

Вы отправляете данные неправильно.

Код указывает JSON, но отправляет только одну строку.Если вы проверяете ItemModel, я уверен, что он будет содержать строковые данные, отправленные клиентом.

Создайте объект JavaScript, а затем зафиксируйте его как тело запроса.

var payload = { ItemModel: 'ttt1', ItemName: 'ttt2' }; //<-- create object
$.ajax({
    type: "POST",
    url: "../Home/AddItem",
    data: JSON.stringify(payload), //<-- properly format for request
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        console.log(JSON.stringify(data));
        if (data.Success == "Success") {
            alert("Item has been added.");
        } else {
            alert("We were not able to create the offer");
        }
    },
    error: function (exception) {                
        console.log(exception);
    }
});

Связыватель модели должен затем иметь возможность различать нужные параметры.

В идеале, когда ожидаются данные в теле запроса, лучше использовать модель

public class Item {
    public string ItemModel { get; set; }
    public string ItemName { get; set; }
}

и выполнить действиеявно ищите его в теле запроса, используя атрибут FromBody

[HttpPost]
public JsonResult AddItem([FromBody]Item item) {
    if(ModelState.IsValid) {
        try {
            var sql = @"INSERT INTO ITEMS(iModel, iName) VALUES ({0}, {1})";
            _DB.Database.ExecuteSqlCommand(sql, item.ItemModel, item.ItemName);
            return Json(new { Success = "Success" });
        } catch (Exception ex) {
            throw ex;
        }
    }
    return Json(new { Success = "BadRequest" });         
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...