Jquery.ajax отправляет null контроллеру, но работает с жестко запрограммированными переменными

#c# #jquery #ajax #asp.net-mvc #asp.net-ajax

#c# #jquery #ajax #asp.net-mvc #asp.net-ajax

Вопрос:

Я делал простое приложение в vs code, и я хочу сохранить значения в базе данных, это то, что у меня есть до сих пор.

  var naziv = $("#TextNaziv").val();
        var cena = $("#TextCena").val();
        var opis = $("#TextOpis").val();

        //console.log("Cena:"   cena);
       // console.log("Opis:"   opis);
       // console.log("Naziv:"   naziv);

        var proizvod = {
            Naziv: "nazivTest123",
            Cena: 33,
            Opis: "opisTest123"
        }

       // console.log(proizvod);
        var zahtev = $.ajax({
            type: "POST",
            url: "/Home/UbaciProizvod",
            data: JSON.stringify(proizvod),
            contentType: "application/json",
            dataType: "text",

        });
 

И это работает просто отлично, без каких-либо проблем, но когда я меняю var prozvod на:

 var proizvod = {
     Naziv: naziv,
     Cena: cena,
     Opis: opis
        }
 

Приложение просто не сохраняет значения в БД, даже если я проверил в консоли, и значения в порядке, контроллер получает нулевое значение. Я перепробовал все, что видел в Интернете, но, похоже, ничего не помогает, возможно, какая-то незначительная проблема, но я не могу ее решить, моя функция контроллера выглядит так:

 public int UbaciProizvod([FromBody] Proizvod p )
{
    string upit = @"INSERT INTO Proizvod VALUES(@Naziv,@Cena,@Opis);
                            SELECT CAST(SCOPE_IDENTITY() AS int)";

        using(SqlConnection konekcija = new SqlConnection(Konekcija.CnnMagacin))
        {
            try
            {
                int id = konekcija.QuerySingleOrDefault<int>(upit,p);
                return id;

            }
            catch (System.Exception)
            {
                
               return -1;
            }
        }
}
 

Это мой первый пост, поэтому приветствуются все предложения и критика, и извините за имена переменных.

Комментарии:

1. Я бы посоветовал вам отладить ответ, возвращающийся из запроса. При этом единственное различие, которое я вижу, заключается в том, что val() возвращает строку, но в рабочей жестко запрограммированной версии вы даете Cena целочисленное значение. Таким образом, вам может потребоваться преобразовать в целое число: Cena: parseInt(cena, 10)

2. Работает как шарм, спасибо, мой брат!, Я использовал ‘Cena: parseInt (cena, 10)’, как вы и предлагали, и это решило все. Еще раз спасибо

3. Рад, что это помогло. Я добавил это как ответ для вас

Ответ №1:

Разница между двумя версиями заключается в том, что Cena в рабочей версии вы указываете целочисленное значение, а в нерабочей — строку.

Чтобы исправить этот вызов parseInt() для значения перед выполнением AJAX-запроса:

 var proizvod = {
  Naziv: naziv,
  Cena: parseInt(cena, 10),
  Opis: opis
}
 

Комментарии:

1. Спасибо за ответ, но я должен спросить вас больше теперь, когда вы упомянули SQL-инъекцию, я знаю, что это такое, но вы уверены, что приведенный выше код открыт для SQL-инъекции, потому что я нашел точно такой же метод для вставки значений в dapper-tutorial.net , и я тоже видел несколько учебных пособий с использованием таким образом, в sql-запросе есть параметры, и, насколько я знаю, Dapper, являющийся ORM, сопоставляет свойства объекта с соответствующими столбцами SQL.

2. Вы правы — ваше использование Dapper правильно. На самом деле я пропустил, что вы вообще использовали Dapper, и неправильно прочитал ваш код. Моя ошибка.