2013-08-12 28 views
7

Với bộ điều khiển:WebAPI: thông số tùy chỉnh bản đồ

public class MyController : ApiController 
{ 
    public MyResponse Get([FromUri] MyRequest request) 
    { 
     // do stuff 
    } 
} 

Và mô hình:

public class MyRequest 
{ 
    public Coordinate Point { get; set; } 
    // other properties 
} 

public class Coordinate 
{ 
    public decimal X { get; set; } 
    public decimal Y { get; set; } 
} 

Và url API:

/api/my?Point=50.71,4.52 

Tôi muốn các Point tài sản của loại Coordinate được chuyển đổi từ giá trị chuỗi truy vấn 50.71,4.52 trước khi tiếp cận điều khiển.

Tôi có thể kết nối với WebAPI ở đâu để làm cho nó xảy ra?

Trả lời

2

Tôi đã thực hiện một điều tương tự với trình kết nối mô hình. Xem tùy chọn # 3 trong số this article.

model binder của bạn sẽ là một cái gì đó như thế này:

public class MyRequestModelBinder : IModelBinder { 
    public bool BindModel(HttpActionContext actionContext, 
          ModelBindingContext bindingContext) { 
     var key = "Point"; 
     var val = bindingContext.ValueProvider.GetValue(key); 
     if (val != null) { 
      var s = val.AttemptedValue as string; 
      if (s != null) { 
       var points = s.Split(','); 
       bindingContext.Model = new Models.MyRequest { 
        Point = new Models.Coordinate { 
         X = Convert.ToDecimal(points[0], 
               CultureInfo.InvariantCulture), 
         Y = Convert.ToDecimal(points[1], 
               CultureInfo.InvariantCulture) 
        } 
       }; 
       return true; 
      } 
     } 
     return false; 
    } 
} 

Sau đó, bạn phải dây nó lên vào hệ thống ràng buộc mô hình trong hành động:

public class MyController : ApiController 
{ 
    // GET api/values 
    public MyRequest Get([FromUri(BinderType=typeof(MyRequestModelBinder))] MyRequest request) 
    { 
     return request; 
    } 
} 
+0

Vấn đề với nó rằng tôi sẽ phải ràng buộc mọi thuộc tính một cách thủ công. Giả sử rằng mô hình cũng có thuộc tính 'int Radius', tôi muốn điều đó tự động ràng buộc. Điều đó có thể không? – David

+0

AFAIK, vâng, bạn phải ràng buộc mọi thứ. Sau khi tất cả, bạn đang nói cho hệ thống làm thế nào để chuyển đổi chuỗi truy vấn thành một thể hiện của một loại. Tôi tưởng tượng bạn có thể thêm một số phản chiếu hocus pocus để phân tích phần còn lại, nhưng tôi đã không làm trong ngữ cảnh này. – ssarabando

+1

Chỉ có thể liên kết một loại tài sản nhất định, chi tiết hơn: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web- api – David