这是经过验证的模型。
public class EstimateItem
{
public string ItemName { get; set; }
public string DisplayName { get; set; }
public string Description { get; set; }
public string Notes { get; set; }
[DataType(DataType.Currency)]
//[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:n2}")]
public decimal PerUnitCost { get; set; }
public string PerUnitDescription { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:n0}")]
[Min(1, ErrorMessage = "Cannot be zero")]
public int Units { get; set; }
public string UnitsDescription { get; set; }
public bool IsEnabled { get; set; }
public bool IsBasedOnHomeSquareFootage { get; set; }
[DataType(DataType.Currency)]
//[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:c2}")]
public decimal Cost { get; set; }
public List<EstimateItemOption> Options { get; set; }
public decimal ItemTotal { get; set; }
}
这是填充模型的文本框。
@Html.TextBoxFor(m => Model.Categories[c].EstimateGroups[g].EstimateItems[i].PerUnitCost,
new { @disabled = "disabled", @onchange = "costUpdate(this);", @cstType = "perUnit" })
这是在调用@onChange
时处理的javascriptcase 'perUnit':
var it = $(src).closest('.itemRow').find("input[cstType='cost']");
var gt = parseFloat(et.html().replace('$', '').replace(',', ''));
et.html(gt - parseFloat(it.val()));
if ($(src).closest('.itemRow').find('[hs]').attr('hs') == 'True') {
var nv = $(src).val();
if (nv == null || nv.length == 0) nv = 0;
it.val(Math.round(nv * parseFloat($('#SquareFootage').val()) * 100) / 100)
$(src).closest('.itemRow').find('.hcst').val(it.val());
et.html(CurrencyFormatted(parseFloat(et.html()) + parseFloat(it.val())));
} else {
var nv = $(src).val();
if (nv == null || nv.length == 0) nv = 0;
it.val(Math.round(nv * parseFloat($(src).closest('.itemRow').find("input[cstType='units']").val()) * 100) / 100)
$(src).closest('.itemRow').find('.hcst').val(it.val());
et.html(CurrencyFormatted(parseFloat(et.html()) + parseFloat(it.val())));
}
break;
我需要知道为什么文本框不会让我使用小于1的小数,如.5 它说perunitcost必须是一个数字
答案 0 :(得分:0)
尝试此操作强制输入数字:
case 'perUnit':
var input = $(src), // may as well cache this as you're using it six times.
it = input.closest('.itemRow').find("input[cstType='cost']"),
gt = parseFloat(et.html().replace('$', '').replace(',', '')),
nv = parseFloat(input.val(), 10); // parse to a float to ensure a number
et.html(gt - parseFloat(it.val()));
if (!nv) { // nv is now either a number, or NaN, so using truthy/falsy to determine if NaN
nv = 0; // technically, 0 is falsy but this sets it to 0 anyway, so not an issue.
}
if (input.closest('.itemRow').find('[hs]').attr('hs') == 'True') {
it.val(Math.round(nv * parseFloat($('#SquareFootage').val()) * 100) / 100)
input.closest('.itemRow').find('.hcst').val(it.val());
et.html(CurrencyFormatted(parseFloat(et.html()) + parseFloat(it.val())));
} else {
it.val(Math.round(nv * parseFloat(input.closest('.itemRow').find("input[cstType='units']").val()) * 100) / 100)
input.closest('.itemRow').find('.hcst').val(it.val());
et.html(CurrencyFormatted(parseFloat(et.html()) + parseFloat(it.val())));
}
break;