2012-04-25 33 views
8

Tôi đã tạo một ứng dụng danh sách việc cần làm đơn giản trong asp.net mvc 3 với api web và dbContext. (với xương sống và requirejs cho khách hàng) Mọi thứ hoạt động tốt, nhưng tôi là loại phiền với thực tế là tôi phải gửi toàn bộ mô hình đến máy chủ nếu tôi kiểm tra hoặc bỏ chọn một mục todo là xong. Tôi chỉ muốn gửi trường "đã hoàn tất" khi gửi dữ liệu.cập nhật một phần với trang web asp.net api

Tôi nên đề cập rằng tôi cũng đang sử dụng JsonNetFormatter để sử dụng JSON.NET làm Trình nối tiếp mặc định (được giải thích tại đây: http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx).

Hiện nay đây là phương pháp điều khiển api của tôi để cập nhật các mô hình

public HttpResponseMessage Put(Todo todo) 
{ 
    _db.Entry(todo).State = EntityState.Modified; 
    _db.SaveChanges(); 
    return new HttpResponseMessage(HttpStatusCode.NoContent); 
} 

Phải mất này như dữ liệu json

{"content":"Pick up milk","done":false,"id":10} 

Off khóa học làm việc này, nhưng nó đang cập nhật toàn bộ mô hình, nó nên chỉ cập nhật 1 trường. Tôi có thể đạt được để chỉ gửi các trường đã thay đổi đến máy chủ từ trình duyệt, nhưng tôi không chắc chắn về phương thức api web sẽ trông như thế nào. Tôi đã suy nghĩ về việc làm một cái gì đó với FormCollection nhưng điều này dường như không làm việc với api web vì nó xuất hiện để cố gắng serialize các formvalues ​​gửi trực tiếp đến FormCollection loại, tôi nhận được lỗi này.

Cannot deserialize JSON object (i.e. {"name":"value"}) into type 'System.Web.Mvc.FormCollection'. 

Làm cách nào để gửi bản cập nhật từng phần cho 1 hoặc nhiều trường từ mô hình lên api web của tôi? Tôi chỉ muốn gửi các trường được cập nhật đến máy chủ và từ đó chỉ cập nhật các trường đó vào cơ sở dữ liệu. Tôi chắc chắn không muốn truy vấn cơ sở dữ liệu trước khi cập nhật.

Trả lời

2

Một cách tiếp cận sẽ được sử dụng một công cụ gọi là Automapper và định cấu hình để giá trị null không ghi đè lên các giá trị hiện có khi ánh xạ đối tượng Todo. Ví dụ:

Mapper.CreateMap<Todo,Todo>() 
     .ForMember(d => d.Id, o => o.Ignore()) 
     .ForAllMembers(mo => mo.Condition(cond => !cond.IsSourceValueNull)); 

Sau đó, bạn sẽ chỉ có bản đồ giá trị đối tượng nhận được đến một trong những tồn tại, như thế này:

Mapper.Map(todo, item); 

gợi ý khác sẽ được sử dụng PATCH thay vì PUT là more appropriate to partial updates of resources according to REST.

+3

Không được bán trên trang này. Điều gì sẽ xảy ra nếu bạn muốn đặt trường thành null? –

+2

Bạn sẽ không thể biết giá trị null đã được đặt bởi người gửi hay chỉ được đặt bởi thực tế là một trường đã bị bỏ qua. Trong trường hợp này, tôi khuyên bạn nên sử dụng động từ PATCH. – elolos

-3

Bạn cần truy vấn các đối tượng ban đầu từ cơ sở dữ liệu, thiết lập thuộc tính của nó & gọi các _db.SaveChange()

public HttpResponseMessage Put(Todo todo){ 
var item = _db.Todo.First(i => i.id = todo.id); 
item.Content = todo.Content; 
item.Done = todo.Done; 
_db.SaveChanges(); 
return new HttpResponseMessage<Todo>(HttpStatusCode.Accepted); 
} 

Ref .: http://msdn.microsoft.com/en-us/library/dd456854.aspx

+7

Điều này không trả lời câu hỏi –

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