我在控制器操作
中将对象数组自定义绑定到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计算只支持浮动数字的句点。
有人知道使用“不变”文化类型将数据发送到控制器的解决方法吗? 谢谢
答案 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更改为不变文化