Javascript ModelState对十进制无效(2000.00)
我在验证模型的1个实例时遇到问题Javascript ModelState对十进制无效(2000.00),javascript,c#,asp.net-mvc,Javascript,C#,Asp.net Mvc,我在验证模型的1个实例时遇到问题medewerker\u functie 在该模型中,我有3个十进制的实例,其中2个正在验证,而Salary没有 这3个实例是uren为40.0,fulltime_salaris为2200.00,salaris为2000.00 在我的Actionresult Create中,我将这些值作为字符串获取,原因是我使用JavaScript从字段中获取值:在填写salaris输入字段时: onblur="$(this).val(parseFloat($(this).val
medewerker\u functie
在该模型中,我有3个十进制的实例,其中2个正在验证,而Salary
没有
这3个实例是uren
为40.0,fulltime_salaris
为2200.00,salaris
为2000.00
在我的Actionresult Create
中,我将这些值作为字符串获取,原因是我使用JavaScript从字段中获取值:在填写salaris
输入字段时:
onblur="$(this).val(parseFloat($(this).val()).toFixed(2))"
用于展示目的
然后就在AJAX调用之前,我使用jQuery获取值,并认为应该尝试将其设置为数字类型的值,所以我做了另一个parseFloat(2000.00)。toFixed(2)
,但这只是将其作为字符串保留,并且不会更改值
这是我的操作结果创建
:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ID,medID,functieID,type_contract,startdatum,einddatum,aantal_uur,aantal_dagen,fulltime_salaris,salaris")] medewerker_functie medewerker_functie, int medID, int functieID, string contract, DateTime startDate, DateTime? endDate, String uren, int dagen, String fulltime, String salaris)
{
System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("en-EN", false);
decimal dec_uren = Convert.ToDecimal(uren.Replace('.', ','), culInfo);
decimal dec_fulltime = Convert.ToDecimal(fulltime.Replace('.', ','), culInfo);
decimal dec_salaris = Convert.ToDecimal(salaris.Replace('.', ','), culInfo);
//Vervang decimaal punten met comma's
//uren = uren.Replace('.', ',');
//fulltime = fulltime.Replace('.', ',');
//salaris = salaris.Replace('.', ',');
//decimal dec_uren = Convert.ToDecimal(uren);
//decimal dec_fulltime = Convert.ToDecimal(fulltime);
//decimal dec_salaris = Convert.ToDecimal(salaris);
//vull medewerker_functie met waardes
medewerker_functie.medID = medID;
medewerker_functie.functieID = functieID;
medewerker_functie.type_contract = contract;
medewerker_functie.startdatum = startDate;
medewerker_functie.einddatum = endDate;
medewerker_functie.aantal_dagen = dagen;
//These are the fields in question but mostly just salaris.
medewerker_functie.aantal_uur = dec_uren;
medewerker_functie.fulltime_salaris = dec_fulltime;
//medewerker_functie.salaris = Convert.ToDecimal(salaris);
medewerker_functie.salaris = dec_salaris;
if (ModelState.IsValid) //The value '2000.00' is not valid for salaris
{
db.medewerker_functie.Add(medewerker_functie);
db.SaveChanges();
return RedirectToAction("Details", "medewerker");
}
ViewBag.functieID = new SelectList(db.functie, "ID", "Functie1", medewerker_functie.functieID);
ViewBag.medID = new SelectList(db.medewerker, "ID", "roepnaam", medewerker_functie.medID);
return View(medewerker_functie);
}
在我的模型中,它们也被指定为十进制:
public decimal aantal_uur { get; set; }
public Nullable<decimal> fulltime_salaris { get; set; }
public Nullable<decimal> salaris { get; set; }
我试过用culInfo
和不使用
转换成十进制,用替换,转换成
和其他方法,但似乎都不起作用,有什么想法吗
但更让我困惑的是,它确实接受2200.00的全日制salaris和40.0的uren
哦,在我的数据库中,字段也被指定为十进制(18,2)
我想我应该提到,这是对错误的搜索,因为它几乎被掩埋了,但这就是我发现错误的地方:
编辑 这是AJAX调用:
console.log(uren, fullTime, salaris); //returns 40.0, 2200.00, 2000.00
console.log($.type(uren), $.type(fullTime), $.type(salaris)); // returns string, string, string
var floatUren = parseFloat(uren).toFixed(1);
var floatFullTime = parseFloat(fullTime).toFixed(2);
var floatSalaris = parseFloat(salaris).toFixed(2);
console.log(floatUren, floatFullTime, floatSalaris); //returns 40.0, 2200.00, 2000.00
console.log($.type(floatUren), $.type(floatFullTime), $.type(floatSalaris)); // returns string, string, string
var form = $('#__AjaxAntiForgeryForm');
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
type: "POST",
url: '@Url.Action("Create", "medewerker_functie")',
data: {
__RequestVerificationToken: token,
medID: medewerker,
functieID: functie,
contract: contract,
startDate: startDate,
endDate: endDate,
uren: floatUren,
dagen: dagen,
fullTime: floatFullTime,
salarispara: floatSalaris
},
success: function() {
alert('Succes!');
},
error: function() {
alert('Failure!');
}
});
修复程序正在更改参数
字符串salaris
的名称。我只能假设它与绑定参数Salaris
冲突,因此我将dec_Salaris
放在模型中,但ModelState.IsValid
正在检查仍然是字符串的Bind参数Salaris
,因此无效
感谢大家的帮助x)听起来您需要一个自定义的模型绑定器才能使用不同的分隔符,因为无论当前区域性设置如何,toFixed
方法都将返回带小数点分隔符的数值。奇怪。。在这篇文章发表后,我立即更改了paramater salaryPara,看看是否有名字冲突。现在,ModelState.isValid
返回true
。。。但是我的ajax调用仍然抛出一个错误
而不是成功
如果ajax回调结果进入错误
部分,那么在提供传递的数据时应该出现了一些问题。您能否提供一些线索,说明使用哪种AJAX回调传递十进制值?让我更新一下问题,给我5分钟我也想和大家分享一张表格,表格中的字段是用一堆变量构建的,并且是分部分设置的,所以很难阅读,除非我给你所有的内容,你必须自己把各个部分粘在一起。但这是工资输入
onSalarisBlur
是onblur=“$(this).val(parseFloat($(this).val()).toFixed(2))”
和numberFieldStyle
只是css
console.log(uren, fullTime, salaris); //returns 40.0, 2200.00, 2000.00
console.log($.type(uren), $.type(fullTime), $.type(salaris)); // returns string, string, string
var floatUren = parseFloat(uren).toFixed(1);
var floatFullTime = parseFloat(fullTime).toFixed(2);
var floatSalaris = parseFloat(salaris).toFixed(2);
console.log(floatUren, floatFullTime, floatSalaris); //returns 40.0, 2200.00, 2000.00
console.log($.type(floatUren), $.type(floatFullTime), $.type(floatSalaris)); // returns string, string, string
var form = $('#__AjaxAntiForgeryForm');
var token = $('input[name="__RequestVerificationToken"]', form).val();
$.ajax({
type: "POST",
url: '@Url.Action("Create", "medewerker_functie")',
data: {
__RequestVerificationToken: token,
medID: medewerker,
functieID: functie,
contract: contract,
startDate: startDate,
endDate: endDate,
uren: floatUren,
dagen: dagen,
fullTime: floatFullTime,
salarispara: floatSalaris
},
success: function() {
alert('Succes!');
},
error: function() {
alert('Failure!');
}
});