2011-07-12 46 views
0

我有一個自定義的控制器動作陣列分爲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 - 開始時間:0 - 結束時間:10 - 日期:1/1/2001 - 開始時間:11 - 結束時間:0

其中0出現十進制值選自:8.5或者例如12.5。 因爲在頁面上覆雜的javascript計算,我不能使用逗號和句點來表示不同的文化,只支持浮動數字。

有沒有人知道一種解決方法,以「不變」的文化類型向控制器發送數據? 感謝

回答

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; 
     } 
    } 

浮點值的自定義模型綁定器,然後,您可以在Global.asax中的的Application_Start

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); 

註冊爲代碼示例和詳細的解釋有看看phil haack's post。當我打電話給Convert.ToDecimal

+0

我非常感謝,這就是我所需要的。 – Maxim