2014-10-14 14 views
10

Tôi có một phương pháp WebAPI, như thế này:Tuỳ chỉnh Boolean Parameter Binding

public string Get([FromUri] SampleInput input) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

Các đầu vào được định nghĩa như thế này:

public class SampleInput 
{ 
    // ...other fields 
    public bool IsAwesome { get; set; } 
} 

Vì nó là, nó hoạt động OK: nếu tôi vượt qua &isAwesome=true trong chuỗi truy vấn, tham số được khởi tạo với giá trị true.

Vấn đề của tôi là tôi muốn chấp nhận cả hai giá trị &isAwesome=true&isAwesome=1 làm giá trị true. Hiện tại, phiên bản thứ hai sẽ dẫn đến IsAwesomefalse trong mô hình đầu vào.


Những gì tôi cố gắng, sau khi đọc bài đăng trên blog khác nhau về đề tài này, là để xác định một HttpParameterBinding:

public class BooleanNumericParameterBinding : HttpParameterBinding 
{ 
    private static readonly HashSet<string> TrueValues = 
     new HashSet<string>(new[] { "true", "1" }, StringComparer.InvariantCultureIgnoreCase); 

    public BooleanNumericParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor) 
    { 
    } 

    public override Task ExecuteBindingAsync(
     ModelMetadataProvider metadataProvider, 
     HttpActionContext actionContext, 
     CancellationToken cancellationToken) 
    { 
     var routeValues = actionContext.ControllerContext.RouteData.Values; 

     var value = (routeValues[Descriptor.ParameterName] ?? 0).ToString(); 

     return Task.FromResult(TrueValues.Contains(value)); 
    } 
} 

... và đăng ký nó trong Global.asax.cs, sử dụng :

var pb = GlobalConfiguration.Configuration.ParameterBindingRules; 
pb.Add(typeof(bool), p => new BooleanNumericParameterBinding(p)); 

var pb = GlobalConfiguration.Configuration.ParameterBindingRules; 
pb.Insert(0, typeof(bool), p => new BooleanNumericParameterBinding(p)); 

Không có cách nào trong số này hoạt động. Tùy chỉnh của tôi HttpParameterBinding không được gọi và tôi vẫn nhận được giá trị 1 được dịch sang false.

Tôi làm cách nào để định cấu hình WebAPI chấp nhận giá trị 1 làm true cho Booleans?

Chỉnh sửa: Ví dụ tôi trình bày được cố ý đơn giản hóa. Tôi có rất nhiều mô hình đầu vào trong ứng dụng của mình và chúng chứa nhiều trường boolean mà tôi muốn được xử lý theo cách được mô tả ở trên. Nếu chỉ có một lĩnh vực này, tôi sẽ không phải dùng đến những cơ chế phức tạp như vậy.

+0

Tôi có đề nghị giải pháp, tạo thuộc tính chỉ đọc nói 'IsAwesome1' trong' SampleInput' và đặt 'IsAwesome' làm chuỗi, đặt 'IsAwesome1' = true chỉ khi' IsAwesome '=' "1" 'hoặc' "true "' –

+0

@ArindamNayak Chỉ đơn giản là có quá nhiều trường như trong ví dụ của tôi và điều đó sẽ làm nổi bật mã. Tôi nghĩ rằng có một cách thanh lịch hơn để làm điều đó trong Web API.Tôi đang quay trở lại MVC cho thời điểm này; Tôi có một 'IModelBinder' làm tốt công việc'. – GolfWolf

Trả lời

4

Dường như trang trí thông số với FromUriAttribute chỉ bỏ qua toàn bộ quy tắc ràng buộc tham số. Tôi đã thực hiện một thử nghiệm đơn giản thay thế các tham số SampleInput đầu vào với một đơn giản bool:

public string Get([FromUri] bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

và sự cai trị boolean vẫn chưa nhận được gọi là (IsAwesome đang đến như null khi bạn gọi &isAwesome=1). Ngay sau khi bạn xóa thuộc tính FromUri:

public string Get(bool IsAwesome) 
{ 
    //do stuff with the input... 
    return "ok"; 
} 

quy tắc được gọi và thông số được ràng buộc chính xác. Lớp FromUriAttribute được niêm phong, vì vậy tôi nghĩ rằng bạn đang khá nhiều hơi say - tốt, bạn luôn có thể reimplement nó và bao gồm logic logic boolean thay thế của bạn^_ ^.