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
và &isAwesome=1
làm giá trị true
. Hiện tại, phiên bản thứ hai sẽ dẫn đến IsAwesome
là false
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));
và
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.
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 "' –
@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