2011-05-17 28 views
5

Tôi có một biểu mẫu được tạo bằng Knockout.js. Khi người dùng nhấn nút gửi, tôi chuyển đổi chế độ xem mô hình trở lại trong một mô hình và đang cố gửi tới máy chủ. Tôi đã thử:Gửi json đến hành động MVC3

ko.utils.postJson(location.href, ko.toJSON(viewModel)); 

Nhưng đối tượng bị để trống khi máy chủ nhấn vào máy chủ. Tôi đã chuyển sang mã này:

$.ajax({ 
    url: location.href, 
    type: "POST", 
    data: ko.toJSON(viewModel), 
    datatype: "json", 
    contentType: "application/json charset=utf-8", 
    success: function (data) { alert("success"); }, 
    error: function (data) { alert("error"); } 
}); 

Điều đó sẽ chuyển dữ liệu đến máy chủ với dữ liệu chính xác trong đó.

Nhưng điều tôi muốn là có dữ liệu được gửi để bộ điều khiển của tôi có thể chuyển hướng đến chế độ xem chính xác. Bất kỳ đề xuất nào?

Trả lời

11

Steve Sanderson có một mẫu cũ mà chứng tỏ việc gửi dữ liệu JSON bị ràng buộc đúng trong hành động điều khiển của bạn ở đây: http://blog.stevensanderson.com/2010/07/12/editing-a-variable-length-list-knockout-style/

Các ý chính của nó là ông đã tạo ra một thuộc tính gọi là "FromJson" trông giống như:

public class FromJsonAttribute : CustomModelBinderAttribute 
{ 
    private readonly static JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    public override IModelBinder GetBinder() 
    { 
     return new JsonModelBinder(); 
    } 

    private class JsonModelBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      var stringified = controllerContext.HttpContext.Request[bindingContext.ModelName]; 
      if (string.IsNullOrEmpty(stringified)) 
       return null; 
      return serializer.Deserialize(stringified, bindingContext.ModelType); 
     } 
    } 
} 

Sau đó, hành động trông giống như:

[HttpPost] 
    public ActionResult Index([FromJson] IEnumerable<GiftModel> gifts) 

Bây giờ, bạn có thể sử dụng ko.utils.postJson để gửi dữ liệu của bạn và trả lời với một cái nhìn thích hợp.

+0

Đó làm việc rất lớn nhờ. Tôi đã làm theo ví dụ bạn đã đề cập. Tôi đã bỏ lỡ phần thuộc tính. –

-2

Ngoài ra, đó là trong ví dụ được đề cập, nhưng bạn có thể cần phải thay đổi gọi JavaScript của bạn để một cái gì đó như:

ko.utils.postJson(location.href, { viewModel: this.viewModel }); 
+0

Điều này thực sự không chính xác. – youwhut

+1

Điều này đã được đề cập trong bài đăng trong câu trả lời khác. –

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