Asp.net mvc 2 模型绑定到具有不同本地化的自定义类型

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计算只支持

我在控制器操作中将对象数组自定义绑定到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());