模型绑定到具有不同本地化的自定义类型

时间:2011-07-12 02:20:19

标签: asp.net-mvc-2 data-binding

我在控制器操作

中将对象数组自定义绑定到IEnumerable预订中

HTML:

<input class='textBox' name='bookings[0].Date' type='text' value='01/01/2001' />
<select name='bookings[0].StartTime' class='startTime'>
  <option value="7">7:00</option>
  <option value="7.5">7:30</option>
  <option value="8">8:00</option>
  <option value="8.5">8:30</option> 
</select>
<select name='bookings[0].EndTime' class='endTime'>
  <option value="7">7:00</option>
  <option value="7.5">7:30</option>
  <option value="8">8:00</option>
  <option value="8.5">8:30</option> 
</select>
....
<input class='textBox' name='bookings[5].Date' type='text' value='01/01/2001' />
<select name='bookings[5].StartTime' class='startTime'>
<select name='bookings[5].EndTime' class='endTime'>

控制器操作:

public ActionResult CreateEvent(IEnumerable<BookingDetails> bookings)
{
  ....
}

用于绑定的容器类

public class BookingDetails
{
    public string Date { get; set; }
    public float StartTime { get; set; }
    public float EndTime { get; set; }
}

“预订”控制器动作参数的集合包含绝对正确的数据,如果页面的文化是en-US但是如果它是“fr-FR”浮动值的时间变为0。 例如:

- 日期:1/1/2001     - StartTime:0     - 结束时间:10    - 日期:1/1/2001     - StartTime:11     - 结束时间:0

其中0出现十进制值被选中:例如8.5或12.5。 我不能用逗号和句号来表示不同文化的值,因为页面上的复杂javascript计算只支持浮动数字的句点。

有人知道使用“不变”文化类型将数据发送到控制器的解决方法吗? 谢谢

1 个答案:

答案 0 :(得分:1)

您可以像

一样为浮点值创建自定义模型绑定器
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;
        }
    }

然后您可以在Application_Start

中的global.asax中注册它
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());

有关代码示例和详细说明,请查看phil haack's post。在调用Convert.ToDecimal

时,我刚刚将Culture更改为不变文化