7

Trong dự án của tôi, tôi muốn cho phép người dùng nhập giá trị kép ở 2 định dạng: bằng cách sử dụng ',' hoặc '.' làm dấu phân tách (tôi không quan tâm đến dạng số mũ). Theo giá trị mặc định với dấu phân cách '.' không làm việc. Tôi muốn hành vi này hoạt động cho tất cả các thuộc tính kép trong các đối tượng mô hình phức tạp (hiện tại tôi làm việc với các bộ sưu tập các đối tượng, chứa các mã định danh và các giá trị).Vấn đề với giá trị kép ràng buộc

Điều tôi nên sử dụng: Nhà cung cấp giá trị hoặc Trình kết nối mô hình? Xin vui lòng, hiển thị mã ví dụ về giải quyết vấn đề của tôi.

+2

http://stackoverflow.com/questions/5050641/asp-net-mvc- mô hình-binder-với-toàn cầu-số-định dạng giúp đỡ ở tất cả? – iwayneo

Trả lời

17

Bạn có thể sử dụng một mô hình tùy chỉnh chất kết dính:

public class DoubleModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (result != null && !string.IsNullOrEmpty(result.AttemptedValue)) 
     { 
      if (bindingContext.ModelType == typeof(double)) 
      { 
       double temp; 
       var attempted = result.AttemptedValue.Replace(",", "."); 
       if (double.TryParse(
        attempted, 
        NumberStyles.Number, 
        CultureInfo.InvariantCulture, 
        out temp) 
       ) 
       { 
        return temp; 
       } 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

có thể được đăng ký tại Application_Start:

ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
+0

Cảm ơn bạn đã trả lời rõ ràng, nhưng mục đích của Nhà cung cấp giá trị là gì? Nó trừu tượng hóa trên các nguồn khác nhau (như thu thập giá trị biểu mẫu, thông số url, biến máy chủ, cookie, v.v ...)? –

+0

Plus, đừng quên thêm cùng một chất kết dính cho loại Nullable – vasilyk