2013-08-06 13 views
11

Tôi đang cố chuyển một số JSON đơn giản tới ASP.NET 4.5 Webmethod từ jQuery. Và nó không hoạt động theo cách tôi muốn. Nó hoạt động nếu tôi chấp nhận đầu vào như các thông số riêng biệt:Chuyển một đối tượng được định nghĩa bởi người dùng tới ASP.NET Webmethod từ jQuery, bằng cách sử dụng JSON

[WebMethod] 
public static Address GetJSonAddress(string name, string street) 

Nhưng nếu tôi cố gắng mang nó như một đối tượng nó không hoạt động, những gì được thông qua trong chỉ đơn giản là null:

[WebMethod] 
public static Address GetJSonAddress(Address newAddress) 

Tôi có đã thử Webmethods, Pagemethods, WCF bằng cách sử dụng DataContractJsonSerializer ... không có gì. Lớp Địa chỉ được trang trí phù hợp với Datamember/DataContract. Các thuộc tính được so khớp bao gồm cả trường hợp. JQuery, trong đó tôi đã thử tất cả các cách truyền dữ liệu bao gồm gói nó trong một đối tượng Địa chỉ ... nếu tôi thực hiện nó theo bất kỳ cách nào khác với những gì tôi có Webmethod không được gọi và tôi gặp lỗi 500. :

Save2 = function() { 
var address = { prefix: GLOBALS.curr_prefix }; 

$('input[id^=' + GLOBALS.curr_prefix + '],select[id^=' + GLOBALS.curr_prefix + ']').each(function() { 
     address[this.id.substr(4)] = $.trim($(this).val()); 
}) 

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "/WebServices/Insert", 
    data: JSON.stringify(address), 
    dataType: "json", 
    success: function (data, textStatus) { 
     console.log(data, textStatus); 
    }, 
    failure: function (errMsg) { 
     MsgDialog(errMsg); 
    } 
}); 
} 

Cuối cùng tôi sẽ phải thực hiện điều này với 121 chuỗi đầu vào và thực sự không muốn có phương pháp với 121 tham số. Bất kỳ trợ giúp được đánh giá cao.

+1

gì sẽ xảy ra nếu bạn sử dụng 'data: {newAddress: JSON.stringify (địa chỉ)}'? – NoLifeKing

+0

Webmethod không được gọi và tôi gặp lỗi 500 tại trình duyệt. POST có vẻ ok: {'Address': {"name": "name", "street": "street", "city": "city", "zip": "11111"}} –

Trả lời

-1

I am not aware of ASP. Nhưng trong Ruby on Rails, chúng tôi đang sử dụng quy trình dưới đây. Hình thức của tôi có gần 20 trường. Thông qua serializeArray(); Tôi có thể gửi tất cả các giá trị trường nhập vào bộ điều khiển. Giống như

HTML của bạn nên được trông giống như

<input class="input" id="violation_date" type="text" name="violation_date" value=""/> 

"name" lĩnh vực là mportant đây.

var form = $("form#driver_info_form").serializeArray(); 
var hsh = { } 
$.each(form, function(i, e) { 
      hsh[e.name] = e.value 
     }); 

var jqxhr = $.post("/app/DriverInfo/save_driver_info", { 
      hsh: hsh 
     }, function() { }); 

Về phía điều khiển chúng ta có thể có được param như

{"hsh"=>{"violation_date"=>"date", "violation_time"=>"time", "violation_day"=>"week", "username"=>"name", "address"=>"address", "city"=>"city", "state"=>"state", "zip"=>"", "driver_lic_number"=>"123324", "radio_commercial"=>"Yes", "age"=>"", "birth_date"=>"", "sex"=>"", "hair"=>"", "eyes"=>"", "height"=>"", "weight"=>"", "race"=>""}, "accident_check"=>"false", "misdemeanor"=>"false", "traffic"=>"false", "non_traffic"=>"false", "commercial"=>"Yes"} 

Từ đó chúng ta có thể truy cập vào các giá trị.

Tôi hy vọng điều này sẽ đưa ra một số hướng dẫn cho bạn.

+0

Loại hướng dẫn nào nên điều này cho OP? Ông đã hỏi một câu hỏi cụ thể để asp.net và bạn trả lời cách bạn sẽ làm điều đó trong một môi trường hoàn toàn khác. – NoRyb

36

Tôi nhanh chóng thiết lập dự án này và tôi đã có thể gọi thành công phương thức web của tôi, vui lòng điều chỉnh mã của bạn cho phù hợp. Đảm bảo rằng các tên thuộc tính lớp học của bạn giống nhau làm tên bạn vượt qua JavaScript.

Webservice

public static Contact getContact(Contact cnt) 
    { 
     cnt.name = "Abijeet Patro"; 
     cnt.phone = "Blah Blah"; 
     return cnt; 
    } 

JavaScript/jQuery

$(document).ready(function() { 
     var cnt = {name:'Hello',phone:'Hello'}; 
     $.ajax({ 
      type: "POST", 
      url: "/Default.aspx/getContact", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: JSON.stringify({'cnt':cnt}), // Check this call. 
      success: function (data) { 
       debugger; 
      } 
     }); 
    }); 

Lớp

public class Contact 
{ 
    public string name { get; set; } 
    public string phone { get; set; } 
} 

Web Service Called


enter image description here

Bạn có thể lấy dự án từ here. Ngoài ra, vui lòng sử dụng trình điều khiển hoặc Chrome để theo dõi các yêu cầu/phản hồi AJAX. Tôi đã thêm hình ảnh để hiển thị cách giám sát các yêu cầu AJAX bằng Chrome. Fiddler thậm chí còn tốt hơn và chi tiết hơn.


enter image description here

+0

Cảm ơn bạn, điều này rất hữu ích và tôi thấy những gì tôi đã làm sai. Trong trường hợp của tôi, nó không có Webmethod tĩnh (ngược lại khi thực hiện nó trong WCF) và có cú pháp JSON.Stringify không chính xác. –

+0

Cảm ơn bạn rất nhiều! –