Chỉ cần tạo giao diện để trả lại thay vì một lớp.
public interface IMyViewModel {
string MyPublicProperty { get; set; }
}
Sau đó tạo một lớp kế thừa giao diện
public class MyViewModel : IMyViewModel {
public string MyPublicProperty { get; set; }
public string MyNotSoPublicProperty { get; set; }
}
Và trở lại giao diện, không phải là lớp học, trong Controller Action
public JsonResult MyJson(){
IMyViewModel model = new MyViewModel();
return Json(model);
}
Và kết quả JSON sẽ
{
'MyPublicProperty': ''
}
Một trong những thách thức trong kịch bản phía máy khách là, nếu bạn đang thay đổi các lớp học của mình, bạn không biết liệu bạn có đang hủy hoại việc triển khai phía máy khách hay không. Nếu bạn sử dụng các loại giao diện trong JSON của mình, bạn hiểu rằng nếu bạn thay đổi giao diện, bạn đang làm một thứ có khả năng có thể giết chết việc triển khai phía máy khách. Và nó cũng giúp bạn tiết kiệm từ việc kiểm tra lại phía máy khách một cách vô ích nếu bạn đang thay đổi thứ gì đó KHÔNG ở dạng inteface (do đó không được sắp xếp theo thứ tự).
Ngoài ra, nhiều lần, Chế độ xem của bạn có thể có các bộ sưu tập lớn hoặc các loại phức tạp trong chúng mà bạn không nhất thiết muốn xuất ra máy khách. Việc này có thể mất nhiều thời gian để tuần tự hóa hoặc hiển thị thông tin đơn giản không thuộc về mã máy khách. Sử dụng giao diện sẽ làm cho nó minh bạch hơn để biết những gì đang được trong đầu ra. Ngoài ra, việc sử dụng các thuộc tính như [ScriptIgnore] trên một thuộc tính chỉ áp dụng cho một trường hợp cụ thể (JavaScript Serialization) buộc bạn phải đối mặt với cùng một vấn đề nếu sau đó bạn đang nối tiếp với XML chẳng hạn. Điều này sẽ không cần thiết phân phối viewmodels của bạn với tấn thuộc tính. Có bao nhiêu người trong số họ thực sự muốn ở đó? Sử dụng intefaces áp dụng bất cứ nơi nào và không có viewmodel cần phải được rải rác với các thuộc tính phụ.
Nguồn
2014-03-31 08:10:28
Hầu hết câu trả lời đều sử dụng Thuộc tính hoặc bao hàm mọi thứ. Tôi chỉ muốn loại trừ một số thuộc tính công khai trong quá trình tuần tự hóa. Tôi đang tìm JSON.NET theo gợi ý của @Charlino nhưng did'nt tìm thấy con đường. Đây là trường hợp: Tôi có thuộc tính 'Lỗi' sẽ chỉ được đặt khi xảy ra lỗi. phía máy khách sẽ kiểm tra điều này trước tiên để hiển thị tin nhắn nếu không sẽ hiển thị phần còn lại của thuộc tính Mô hình. Khi không có lỗi, nó sẽ trả về '{...," Lỗi ": null}'! – CallMeLaNN