我正在尝试在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中缺少某些内容。
答案 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
})