2013-02-04 36 views
8

Tôi sử dụng trong một số mô hình một lớp mô hình phụ (UserInfo) có chứa một số thông tin liên quan đến người dùng. mô hình phụ này có thể được sử dụng trong các mô hình khác nhau, Ví dụModelBinder và mô hình phụ

public class Model 
{ 
    int string Value { get; set; } 
    public UserInfo User { get; set; } 
} 

tôi đã tạo ra một mô hình chất kết dính và đăng ký nó trong WebApiConfig

config.BindParameter(typeof(UserInfo), new UserModelBinder()); 

Điều là UserModelBinder không được gọi bởi các WebAPI đường ống xử lý. Có vẻ như các modelbinders này không được gọi cho các mô hình phụ. Tui bỏ lỡ điều gì vậy ?

Trả lời

1

Hãy xem câu hỏi này What is the equivalent of MVC's DefaultModelBinder in ASP.net Web API? để biết một số chi tiết về nơi các ràng buộc của bạn sắp xảy ra.

Tôi cho rằng mặc dù Model của bạn đang được chuyển trong nội dung thư?

Nếu sau đó WebApi sẽ sử dụng trình định dạng để deserialise các loại của bạn và xử lý mô hình, mặc định là XmlMediaTypeFormatter, JsonMediaTypeFormatter hoặc FormUrlEncodedMediaTypeFormatter.

Nếu bạn đăng mô hình trong nội dung, tùy thuộc vào loại nội dung bạn yêu cầu hoặc được chấp nhận là (application/xml, application/json, v.v.), bạn có thể cần phải tùy chỉnh cài đặt serialiser hoặc gói hoặc thực hiện MediaTypeFormatter của riêng bạn.

Nếu bạn đang sử dụng ứng dụng/json thì bạn có thể sử dụng JsonConverters để tùy chỉnh tuần tự hóa lớp UserInfo của mình. Có một ví dụ về điều này ở đây Web API ModelBinders - how to bind one property of your object differently và tại đây WebApi Json.NET custom date handling

internal class UserInfoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeOf(UserInfo); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, 
           JsonSerializer serializer) 
    { 
     // 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // 
    } 
} 
1

HttpConfigurationExtensions.BindParameter phương pháp đăng ký rằng cho loại thông số trên một hành động là bị ràng buộc bằng cách sử dụng chất kết dính mô hình .

vì vậy những gì bạn đã làm cũng tương tự như:

void Action([ModelBinder(UserModelBinder)] UserInfo info) 

Nó chỉ hoạt động nếu tham số hành động là loại quy định (UserInfo).

Hãy thử đặt khai binder mô hình trên UserInfo lớp chính nó, để nó toàn cầu:

[ModelBinder(UserModelBinder)] public class UserInfo { } 

Tuy nhiên, có một số khác biệt trong cách làm thế nào WebAPI và các thông số ràng buộc MVC. Dưới đây là chi tiết explanation của Mike Stall.

+0

Việc đặt thuộc tính ModelBinder cũng không hoạt động. – user49126

Các vấn đề liên quan