Ajax方法在十进制时未命中控制器

时间:2019-04-24 06:51:32

标签: javascript c# asp.net ajax asp.net-mvc

我正在尝试在Web应用程序中添加时间注册功能。用户具有一个表单,可以在其中选择他从事的项目,然后输入在该项目上花费的时间。

现在这可以正常工作,直到您开始增加半小时。像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 个答案:

答案 0 :(得分:2)

请确保您要发送的十进制类型以...开头(如您的代码所示),它当前正在发送的是字符串而不是十进制...

parseFloat()属性上使用hours,以便在将其发送到控制器时将其正确序列化为JSON。


编辑:

这是一个具有约束力的问题...

我们需要将控制器上的参数提取到模型中

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)

那应该可以解决您的问题


编辑

$.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',

答案 1 :(得分:0)

我试图复制您的源代码。

它在小时数为“ 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:控制器 {

 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>

答案 2 :(得分:0)

尝试使用以下方法将“小时”值转换为数字:

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
})