2010-04-21 40 views
10

Tôi đang cố gắng đăng JSON qua AJAX tới trang ASP cổ điển, truy xuất giá trị, kiểm tra cơ sở dữ liệu và trả về JSON cho trang gốc.Nhận biến ASP cổ điển từ được đăng JSON

Tôi có thể đăng JSON qua AJAX. Tôi có thể trả về JSON từ ASP. Tôi không thể truy xuất JSON đã đăng vào biến ASP.

BÀI bạn sử dụng Request.Form, GET bạn sử dụng Request.Querystring. Tôi sử dụng gì cho JSON?

Tôi có thư viện JSON nhưng chúng chỉ hiển thị việc tạo chuỗi trong tập lệnh ASP và sau đó phân tích cú pháp đó. Tôi cần phải phân tích cú pháp JSON khi được chuyển một biến bên ngoài.

Javascript tập tin

var thing = $(this).val(); 

$.ajax({ 
     type: "POST", 
     url: '/ajax/check_username.asp', 
     data: "{'userName':'" + thing + "'}", 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     cache: false, 
     async: false, 
     success: function() { 
      alert('success'); 
     } 
}); 

ASP (check_username.asp)

Response.ContentType = "application/json" 
      sEmail = request.form() -- THE PROBLEM 

      Set oRS = Server.CreateObject("ADODB.Recordset") 
      SQL = "SELECT SYSUserID FROM dbo.t_SYS_User WHERE Username='"&sEmail&"'" 
      oRS.Open SQL, oConn 
      if not oRS.EOF then 
      sStatus = (new JSON).toJSON("username", true, false) 
      else 
      sStatus = (new JSON).toJSON("username", false, false) 
     end if 
response.write sStatus 
+0

Tôi không có một câu trả lời, nhưng bạn có mọi thông cảm của tôi ... asp cổ điển và xử lý JSON - nghe có vẻ vui. – Paddy

+0

Điều đó rất tò mò ... Bạn có chắc nó không phải là POST hoặc GET mà JSON đang gửi đi không ?! Bạn đã thử xác minh nó với ví dụ của Alex? – cregox

+3

@Paddy: ASP cổ điển vẫn giúp đặt thức ăn lên đĩa cho gia đình tôi. Cũng giống như COBOL, nó đã chết. ;-) – Taptronic

Trả lời

-1

Bạn có thể tìm thấy tất cả các thông số đăng qua mã này.

FUNCTION getQueryString() 
    dim queryLink, queryItemName 
    queryLink = "" 
    On error Resume Next 
    For each queryItemName in Request.QueryString 
     Execute(queryItemName & " = stripQuery(Request.QueryString(""" & queryItemName & """))") 
     queryLink = queryLink & "&" & queryItemName & "=" & Request.QueryString(queryItemName) 
    Next 
    For each queryItemName in Request.Form 
     Execute(queryItemName & " = stripQuery(Request.Form(""" & queryItemName & """))") 
     queryLink = queryLink & "&" & queryItemName & "=" & Request.Form(queryItemName) 
    Next 
    On Error Goto 0 
    getQueryString = queryLink 
END FUNCTION 

response.write getQueryString() 
+0

Vấn đề là khi JSON được POST đến một trang ASP cổ điển, nó không phân tích cú pháp nó thành đối tượng Form. Tương tự như vậy nếu bạn có nó trong một GET mà không buộc nó vào một paramter. – alphadogg

1

Bạn có thể xem xét chuyển từ VBScript sang JScript (JScript là những gì mà Microsoft gọi là JavaScript).

Tại sao? Vì sau đó từ bên trong ASP cổ điển, bạn có thể thực hiện các cuộc gọi JSON giống nhau mà trình duyệt có thể thực hiện và đọc kết quả vào các đối tượng JavaScript bằng cách sử dụng câu lệnh eval().

Paddy Said: Tôi không có câu trả lời, nhưng bạn có tất cả sự thông cảm của tôi ... ASP cổ điển và xử lý JSON - nghe có vẻ thú vị.

@Paddy: ASP cổ điển và JSON LÀ thú vị, trên thực tế là ROCKS! (Nếu bạn chuyển từ VBScript và sử dụng JScript.)

Lưu ý rằng bạn không phải thoát khỏi gà tây lạnh VBScript, bạn vẫn có thể tương tác giữa hai tệp trong cùng một tệp ASP nhưng nếu bạn khai báo JScript trước để hạn chế VBScript của bạn để SUB hoặc chức năng và ngược lại nếu không những điều không thể đoán trước có thể xảy ra.

Dưới đây là một ví dụ nhanh về những gì tôi đang nói về:

<%@ LANGUAGE="JScript" %> 
<% 

var days = VBDateDiff("d", "4/10/2010", "5/3/2010"); 
Response.write("JScript Calling VBScript function: days = " + days); 


%> <script language="VBScript" runat="server"> 
function VBDateDiff(units, datebefore, dateafter) 
    VBDateDiff = CStr(DateDiff(units, datebefore, dateafter)) 
end function 

function VBDateAdd(units, nUnits, theDate) 
    Response.write("<BR>VBDateAdd units=" & units & ", nUnits=" & nUnits & ", theDate=" & theDate) 
    VBDateAdd = CStr(DateAdd(units, nUnits, theDate)) 
    Response.write(", VBDateAdd=" & VBDateAdd) 
end function 
</script> <%   

%> 
+1

nó sẽ không thực sự nguy hiểm để làm một eval phía máy chủ của một chuỗi json? – Ben

+1

Có, nhưng làm cách nào để bạn truy cập dữ liệu đã đăng? – alphadogg

1

Tôi có cùng một vấn đề nhưng rất sớm tôi tìm ra cách để gửi một đối tượng JSON đến máy chủ ASP.

Đây là ý tưởng: chưa được thử nghiệm. Làm việc chăm chỉ trên nó> <.

Phân tích các đối tượng json vào chuỗi sau đó gửi lại cho máy chủ. (Đây là một chuỗi niêm yết tiêu biểu)

trên ASP bên, sử dụng thư viện JSON để phân tích chuỗi lại vào đối tượng.

liên kết cho các thư viện JSON http://code.google.com/p/aspjson/

'tôi giả ppl rằng thử bài JSON trở lại asp nên có kiến ​​thức cơ bản gửi bài. Mọi trợ giúp thêm xin vui lòng cho tôi biết

0

Nói chung (VBArray (arr) .toArray() mới sẽ hoạt động trên SafeArray, đó là những gì Request.BinaryRead trả về. Nhưng nó không.Tôi tìm thấy giải pháp này mà tôi sửa đổi:

function GetRawRequestData() { 
    var byteCount = Request.TotalBytes; 
    var binary = Request.BinaryRead(byteCount) 
    var reader = Server.CreateObject('ADODB.Recordset'); 
    reader.Fields.Append('x', 201, byteCount); 
    reader.Open(); 
    reader.AddNew(); 
    reader.Fields(0).AppendChunk(binary); 
    reader.update(); 
    return reader.Fields(0).Value; 
} 

nhờ bình luận Rasberry của @http://blogs.msdn.com/b/david.wang/archive/2006/07/04/howto-convert-between-jscript-array-and-vb-safe-array.aspx

Lưu ý rằng nó có thể không xử lý mã hóa một cách chính xác. Tôi đã không đi sâu vào những gì 201 cho datatype ADO có nghĩa là, nhưng nó hoạt động.

1

Không biết nếu bạn vẫn đang tìm kiếm, nhưng điều này answer có thể giúp bạn. Tuy nhiên, mã cho các trang ASP.NET. ASP tương tự cổ điển là:

byteCount = Request.TotalBytes 
    requestBody = Request.BinaryRead(byteCount) 

Sau đó, bạn có thể muốn biến thành chuỗi để phân tích/sử dụng. Bạn có thể sử dụng ADODB.Stream cho chuyển đổi. giải pháp

Set bStream= CreateObject("ADODB.Stream") 
    bStream.Open 
    bStream.Write requestBody 
    bStream.Position = 0 
    bStream.Type = adTypeText 
    str = bStream.ReadText 
2

alphadogg đã không làm việc cho tôi, tôi có lỗi với dòng bStream.Write requestBody (nói "hoạt động không được phép trong bối cảnh này.") Điều này dường như làm việc cho tôi, và trả về chuỗi yêu cầu nói chung. Tuy nhiên, nó sẽ chỉ làm việc cho dữ liệu yêu cầu < = 100 KB, nếu không bạn sẽ phải tìm ra cách để phương thức BinaryRead hoạt động.

str = Request.Form 

(Được phát hiện từ http://msdn.microsoft.com/en-us/library/ms525985%28v=VS.90%29.aspx) mã

2

alphadogg của làm việc cho tôi, nhưng chỉ sau khi tôi đã chỉ định thêm một chút thông tin:

bytecount = Request.TotalBytes 
bytes = Request.BinaryRead(bytecount) 

Set stream = Server.CreateObject("ADODB.Stream"); 
stream.Type = 1; // adTypeBinary    
stream.Open();         
stream.Write(bytes); 
stream.Position = 0;        
stream.Type = 2; // adTypeText     
stream.Charset = "utf-8";       
Set s = stream.ReadText();      
stream.Close();         

Trước đó tôi sẽ nhận được "hoạt động không được phép trong ngữ cảnh này." như jjokin đã báo cáo.

2

Dưới đây là giải pháp mà tôi sử dụng trong ASP VBScript với mã Radium và một số điều chỉnh:

bytecount = Request.TotalBytes 
bytes = Request.BinaryRead(bytecount) 

Set stream = Server.CreateObject("ADODB.Stream") 
    stream.Type = 1 'adTypeBinary    
    stream.Open()         
     stream.Write(bytes) 
     stream.Position = 0        
     stream.Type = 2 'adTypeText     
     stream.Charset = "utf-8"      
     s = stream.ReadText() 'here is your json as a string     
    stream.Close() 
Set stream = nothing 

Response.write(s) 
Các vấn đề liên quan