过帐时在模型中将十进制值设置为 null
本文关键字:十进制 设置 null 模型 | 更新日期: 2023-09-27 18:30:51
我有一个剑道数字文本框
@(Html.Kendo().NumericTextBoxFor(m => m.SomeDecimal)
.Name("SomeDecimal")
.Min(0)
.Max(99999999)
.Decimals(2)
)
当发布包含此NumericTextbox的表单时,模型中SomeDecimal 的值设置为null。
请注意:我用普通文本框替换了剑道数字文本框,并遇到了同样的问题,因为输入的数字包含句号 (.) 而不是逗号 (,)。当我用逗号替换句号时,一切都按预期工作。
我是否必须指定不同的文化?
我找到了解决此问题的方法,
我创建了一个新的类DecimalModelBinder来覆盖十进制字段的默认模型绑定。代码如下。在这里,我尝试转换十进制值,如果转换失败,我用逗号替换所有句号并尝试再次转换。如果第二次转换尝试失败,我会将所有逗号替换为句号,然后重试。
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var modelState = new ModelState {Value = valueResult};
object actualValue = null;
try
{
// Try to convert the actual number that was recieved.
actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
}
catch
{
try
{
// Replace any . with , and try to convert.
actualValue = Convert.ToDecimal(valueResult.AttemptedValue.Replace('.',','), CultureInfo.CurrentCulture);
}
catch
{
try
{
// Replace any , with . and try to convert.
actualValue = Convert.ToDecimal(valueResult.AttemptedValue.Replace(',', '.'), CultureInfo.CurrentCulture);
}
catch (Exception ex)
{
modelState.Errors.Add(ex);
}
}
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
您必须在 Global.asx 文件中添加 DecimalModelBinder
protected void Application_Start()
{
RouteTable.Routes.MapHubs();
AreaRegistration.RegisterAllAreas();
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
// All other code.
}