2012-07-23 37 views
10

Tôi đăng json với các tên biến có dấu gạch dưới (like_this) và cố gắng liên kết với mô hình được gắn liền (LikeThis), nhưng các giá trị không thể bị ràng buộc.Mô hình MVC 3 ràng buộc với dấu gạch dưới

Tôi biết tôi có thể viết một mô hình tùy chỉnh chất kết dính, nhưng kể từ khi quy ước nhấn mạnh là rất phổ biến tôi mong đợi rằng một giải pháp đã tồn tại.

Hành động/mô hình tôi đang cố gắng để gửi đến là:

/* in controller */ 
[HttpPost] 
public ActionResult UpdateArgLevel(UserArgLevelModel model) { 
    // do something with the data 
} 

/* model */ 
public class UserArgLevelModel { 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 
    public int ArgLevelId { get; set; } 
} 

và các dữ liệu json giống như:

{ 
    id: 420007, 
    first_name: "Marc", 
    surname: "Priddes", 
    arg_level_id: 4 
} 

(Đáng tiếc là tôi không thể thay đổi một trong hai việc đặt tên của một trong hai json hoặc mô hình)

+2

hiển thị cho chúng tôi mã số – Shyju

+0

thêm vào, nó thực sự không có gì thú vị mặc dù ... –

+0

tại sao không thay đổi JSON để phù hợp với các tên thuộc tính mô hình? – Shyju

Trả lời

10

Bạn có thể bắt đầu viết customJson.NETContractResolver:

public class DeliminatorSeparatedPropertyNamesContractResolver : 
    DefaultContractResolver 
{ 
    private readonly string _separator; 

    protected DeliminatorSeparatedPropertyNamesContractResolver(char separator) 
     : base(true) 
    { 
     _separator = separator.ToString(); 
    } 

    protected override string ResolvePropertyName(string propertyName) 
    { 
     var parts = new List<string>(); 
     var currentWord = new StringBuilder(); 

     foreach (var c in propertyName) 
     { 
      if (char.IsUpper(c) && currentWord.Length > 0) 
      { 
       parts.Add(currentWord.ToString()); 
       currentWord.Clear(); 
      } 
      currentWord.Append(char.ToLower(c)); 
     } 

     if (currentWord.Length > 0) 
     { 
      parts.Add(currentWord.ToString()); 
     } 

     return string.Join(_separator, parts.ToArray()); 
    } 
} 

này là dành cho trường hợp cụ thể của bạn, becase bạn cần một snake caseContractResolver:

public class SnakeCasePropertyNamesContractResolver : 
    DeliminatorSeparatedPropertyNamesContractResolver 
{ 
    public SnakeCasePropertyNamesContractResolver() : base('_') { } 
} 

Sau đó, bạn có thể viết một thuộc tính tùy chỉnh để trang trí những hành động điều khiển của bạn:

public class JsonFilterAttribute : ActionFilterAttribute 
{ 
    public string Parameter { get; set; } 
    public Type JsonDataType { get; set; } 
    public JsonSerializerSettings Settings { get; set; } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    {  
     if (filterContext.HttpContext.Request.ContentType.Contains("application/json")) 
     { 
      string inputContent; 
      using (var reader = new StreamReader(filterContext.HttpContext.Request.InputStream)) 
      { 
       inputContent = reader.ReadToEnd(); 
      } 

      var result = JsonConvert.DeserializeObject(inputContent, JsonDataType, Settings ?? new JsonSerializerSettings()); 
      filterContext.ActionParameters[Parameter] = result; 
     } 
    } 
} 

Và cuối cùng:

[JsonFilter(Parameter = "model", JsonDataType = typeof(UserArgLevelModel), Settings = new JsonSerializerSettings { ContractResolver = new SnakeCasePropertyNamesContractResolver() })] 
public ActionResult UpdateArgLevel(UserArgLevelModel model) { 
{ 
    // model is deserialized correctly! 
} 
+1

Tìm kiếm một cái gì đó như thế này cho đôi khi bây giờ. Cảm ơn!!! – MilkyWayJoe

+1

Bạn sẽ thấy rằng việc tuần tự hóa các PropertyNames như DOBProperty sẽ giải quyết như d_o_b_property - [câu trả lời này] (http://stackoverflow.com/a/7275039/159341) cho kết quả tốt hơn nếu bạn cần phục vụ cho trường hợp sử dụng này. – Tr1stan

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