2011-12-27 34 views
5

Tôi tạo ra một new object() trong Javascript, đặt một số giá trị vào nó và đưa nó cho một PageMethod ...Tiếp nhận đối tượng năng động trong PageMethod từ javascript

var filters = new object(); 

filters.Name = $("#tbxName").val(); 
filters.Age = parseInt($("#tbxAge").val()); 

PageMethods.getPeople(filters, getPeopleCallback); 

... trong đó, chữ ký của nó, nhận được một dynamic tranh luận.

[WebMethod] 
public static object getPeople(dynamic filters) 
{ 
    ... 

Toàn bộ mã biên dịch và chạy không có vấn đề, trừ PageMethod phía máy chủ, mà hiểu được thông số dynamic như một Dictionary.

Khi tôi gỡ lỗi mã để xem định nghĩa của đối tượng filters, nó cho thấy tôi các loại sau đây: filters = {System.Collections.Generic.Dictionary<string,object>}

Vì vậy, thỏa thuận cách duy nhất với nó là sử dụng nó như là một Dictionary ...

var name = filters["Name"]; 
var age = filters["Age"] as int?; 

.. Nhưng ý định của tôi là sử dụng nó như là một đối tượng động

var name = filters.Name; 
var age = filters.Age; 

tôi biết rằng đây không phải là một vấn đề lớn tại al l, và hoàn toàn không có vấn đề gì khi tôi truy cập nó như một từ điển (và tôi cũng biết mình có thể tạo một "Proxy" DynamicObject để truy cập từ điển như một đối tượng động).

Tôi chỉ muốn hiểu điều này. Vì vậy:

  1. Tại sao PageMethod hiểu nó là Từ điển?
  2. Có cách nào để thực hiện công việc này dưới dạng đối tượng Động (ngoại trừ phương pháp "Proxy") không?

Tôi đã hy vọng rằng điều này có thể làm việc vì tôi thường xác định những Filter Lớp học trên Server Side và tạo ra nó trong Javascript sau cùng cấu trúc, và PageMethod hiểu nó và chuyển đổi nó một cách chính xác khi tôi xác định loại đó như là một lập luận (ví dụ: getPeople(Filters filters)). Vì vậy, tôi đã tự hỏi nếu nó có thể làm điều đó cũng với các đối tượng năng động (tiết kiệm thời gian và các lớp học không cần thiết).

Tôi đánh giá cao thời gian và trợ giúp của bạn.

+1

Tôi sẽ ngạc nhiên nếu 'PageMethod' hiểu' động'. 'PageMethod' là dịch vụ web kiểu ASMX kế thừa, đã ở trạng thái" cũ "kể từ trước khi' dynamic' tồn tại. Ngoài ra, nói chung, bạn nên chuyển dữ liệu cụ thể cho nền tảng cho các dịch vụ web và 'dynamic' là cụ thể cho .NET. –

+0

@JohnSaunders: Hãy ngạc nhiên sau đó. ASMX và các phương thức trang hoạt động tốt với các giá trị trả về 'dynamic' được gõ. Quan trọng hơn, WCF/DCJS không xử lý các tham số đầu vào 'dynamic' nào tốt hơn ASMX/JSS, điều này khiến cho ASMX cũ và WCF tranh luận về điểm moot để đưa ra. –

+0

@DaveWard: trong trường hợp này, trong đó 'dynamic' được sử dụng làm thông số đầu vào? Ngoài ra, trong trường hợp của một giá trị trả về, một trả về 'dynamic' trông như thế nào với một máy khách SOAP? Hay bạn chỉ đề cập đến REST? Ngoài ra, bạn có thể nói những gì bạn có nghĩa là "hoạt động tốt"? Tôi nói "hiểu". –

Trả lời

2
  1. Lý do phương pháp trang xử lý từ khóa đó là do JavaScriptSerializer hoạt động nội bộ như thế nào. Vì tất cả các đối tượng JSON có thể được biểu diễn dưới dạng Dictionary<string, object>, đầu tiên của JSS là chuyển đổi chuỗi JSON thành từ điển (nếu không có trình biến đổi tùy chỉnh nào cho loại mục tiêu được đăng ký) và bạn kết thúc với Từ điển đó làm kết quả cuối cùng của chuyển đổi cho động lực học.

  2. Không dễ dàng.

Bạn có thể thử nghiệm bằng cách viết JavaScriptConverter của riêng mình cho dynamic. Đây là một ví dụ về một cái gì đó trong sân chơi bóng chày cùng mà tôi đã viết một khi trở lại: https://gist.github.com/6cfcdfdf2a117fa5e81b

Mine của tùy biến hành vi serialization thay vì deserialization, nhưng bạn có thể thực hiện mã của riêng bạn trong các phương pháp Deserialize để làm điều đó.

+0

Cảm ơn bạn đã giải thích! Tôi cũng sẽ kiểm tra liên kết của bạn và thực hiện một số thử nghiệm ...;) – everton

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