Ajax метод не попадает в контроллер при десятичном - PullRequest
3 голосов
/ 24 апреля 2019

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

Теперь это работает нормально, пока вы не начнете добавлять полчаса. как 5.5. По какой-то причине Ajax не попадает в контроллер. Когда я получаю console.log ответ, он говорит, что параметр 'hours' не может быть пустым и должен быть установлен как необязательный. Поэтому я предполагаю, что по какой-то причине моя переменная не принимает десятичное число.

function AddTimeReg() {
...
 var hours;
    var language = window.navigator.userLanguage || window.navigator.language;
    if (language === "en-US"){
         hours = $("#Hours").val().trim().replace(",", ".");
    }
    else{
         hours = $("#Hours").val().trim().replace(".", ",");
    }
   ...
        $.ajax({
            type: 'post',
            url: appPath + '/TimeReg/ShopDoc',
            data: {
                regDate: date, salesOrder: salesorder, shopDoc: shopdoc, startTime: convertedStartTime, endTime: convertedEndTime,
                hours: hours, info: info, timeRegLineNr: timeRegLineNr
            },
...
}

И контроллер:

public ActionResult ShopDoc(DateTime regDate, string salesOrder, string shopDoc, string startTime, string endTime, decimal hours, string info, int timeRegLineNr)
  {
      ... 
  }

Итак, по какой-то причине: он отлично работает с часами, такими как 5, 2 или 8 ... но контроллер не попадает под точку останова, если мы набираем 5.5 или 2,5.

Редактировать: Не дубликат ссылки. В ссылке мы говорим о предоставлении параметра в URL как actionresult и о проблеме, которая существует в c #, в то время как здесь, я считаю, что в JS чего-то не хватает.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

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

Используйте parseFloat() в свойстве hours, чтобы оно корректно сериализовалось в JSON при отправке на контроллер.


Edit:

Это обязательный вопрос ...

Нам нужно извлечь параметры вашего контроллера в модель

public class ShopDocModel
{
    public DateTime regDate   {get;set;} 
    public string salesOrder  {get;set;}
    public string shopDoc     {get;set;}
    public string startTime   {get;set;}
    public string endTime     {get;set;}
    public decimal hours      {get;set;}
    public string info        {get;set;}
    public int timeRegLineNr { get; set; }
}

, а затем ссылка на это в параметре контроллера

public ActionResult ShopDoc(ShopDocModel model)

Это должно решить вашу проблему


EDIT

$.ajax({
        type: 'post',
        url: appPath + '/TimeReg/ShopDoc',
        data: JSON.stringify({
            regDate: date, salesOrder: salesorder, shopDoc: shopdoc, startTime: convertedStartTime, endTime: convertedEndTime,
            hours: hours, info: info, timeRegLineNr: timeRegLineNr
        }),
contentType: 'application/json; charset=utf-8',
0 голосов
/ 24 апреля 2019

Попробуйте преобразовать значение «часов» в число, используя:

hours = Number(hours).toFixed(2);

Затем используйте JSON.stringify над «данными».Как то так:

data: JSON.stringify({
            regDate: date, salesOrder: salesorder, shopDoc: shopdoc, startTime: convertedStartTime, endTime: convertedEndTime,
            hours: hours, info: info, timeRegLineNr: timeRegLineNr
})
0 голосов
/ 24 апреля 2019

Я пытался воспроизвести ваш исходный код.

Он хорошо работал со значением "2,5" или 2,5 в часах.

Если вы установите "2,5", связующее для модели MVC не может быть приведено к десятичному числу.Вам нужно изменить свой сценарий.

if (language === "en-US"){
         hours = $("#Hours").val().trim().replace(",", ".");
    }
    else{
         hours = $("#Hours").val().trim().replace(".", ",");
    }

на

hours = $("#Hours").val().trim().replace(",", ".");

Обновление кода воспроизведения:

Вы можете создать другой контроллер для воспроизведения.Также вы должны создать объект и консольный журнал для просмотра реальных данных перед вызовом ajax:

var form = {
                regDate: date, salesOrder: salesorder, shopDoc: shopdoc, startTime: convertedStartTime, endTime: convertedEndTime,
                hours: hours, info: info, timeRegLineNr: timeRegLineNr
            }
console.log(form);

открытый класс HomeController: Controller {

 public ActionResult ShopDoc(DateTime regDate, string salesOrder, string shopDoc, string startTime, string endTime, decimal hours, string info, int timeRegLineNr)
    {
        return null;
    }

}

Index.cshtml

<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script>
    $.ajax({
        type: 'post',
        url: '/Home/ShopDoc',
        data: {
            regDate: '2019-11-11',
            salesOrder: "1",
            shopDoc: "1",
            startTime: '2019/11/11',
            endTime: '2019/11/11',
            hours: "2.5",
            info: "1",
            timeRegLineNr: 1
        }, success: function (result) {

        },
        error: function (req, status, error) {

        }
    });

</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...