Asp.net mvc 2 模型绑定到具有不同本地化的自定义类型
我在控制器操作中将对象数组自定义绑定到IEnumerable bookings中 HTML: 如果页面的区域性为en US,则控制器操作参数的“bookings”集合包含的数据绝对正确,但如果是“fr fr”,则时间的浮点值为0。 例: --日期:2001年1月1日 -开始时间:0 -结束时间:10 --日期:2001年1月1日 -开始时间:11 -结束时间:0 当0出现时,选择了十进制值:例如8.5或12.5。 我不能为不同的区域性设置逗号和句号,因为页面上复杂的javascript计算只支持浮点数的句号 是否有人知道一种解决方法,可以使用“不变”区域性类型将数据发送到控制器?Asp.net mvc 2 模型绑定到具有不同本地化的自定义类型,asp.net-mvc-2,data-binding,Asp.net Mvc 2,Data Binding,我在控制器操作中将对象数组自定义绑定到IEnumerable bookings中 HTML: 如果页面的区域性为en US,则控制器操作参数的“bookings”集合包含的数据绝对正确,但如果是“fr fr”,则时间的浮点值为0。 例: --日期:2001年1月1日 -开始时间:0 -结束时间:10 --日期:2001年1月1日 -开始时间:11 -结束时间:0 当0出现时,选择了十进制值:例如8.5或12.5。 我不能为不同的区域性设置逗号和句号,因为页面上复杂的javascript计算只支持
谢谢您可以为浮点值创建自定义modelbinder,如
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try
{
actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
CultureInfo.InvariantCulture);
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
然后您可以在应用程序_Start的global.asax中注册它
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
有关代码示例和详细说明,请参阅。我刚刚在调用Convert.ToDecimal时将区域性更改为不变区域性
public class BookingDetails
{
public string Date { get; set; }
public float StartTime { get; set; }
public float EndTime { get; set; }
}
public class DecimalModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName);
ModelState modelState = new ModelState { Value = valueResult };
object actualValue = null;
try
{
actualValue = Convert.ToDecimal(valueResult.AttemptedValue,
CultureInfo.InvariantCulture);
}
catch (FormatException e)
{
modelState.Errors.Add(e);
}
bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
return actualValue;
}
}
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());