2017-01-26 20 views
3

У меня есть некоторые значения сеанса, которые я постоянно меняю посредством вызовов Ajax. Кажется, я не могу обработать данные POST, чтобы обработать его и установить значения.Чтение данных POST в вызове AJAX

То, что я передаю ему, представляет собой массив строк, как показано в моем коде ниже.

Вот где AJAX звонки:

var sessionValues = []; 
str = {"PID": "1", "Level": "Main", "MenuName": "Kitchen", "State": "CHECKED"} 
sessionValues.push(str); 
var postObj = {"sessionData": sessionValues}; 

$.ajax({ 
    type: 'POST', 
    data: {'data': postObj}, 
    url: 'setSession.asp' 
}).done(function(response){ 
console.log(response); 
}) 

я это прекрасно работать в PHP версии программы, но моя ASP версия не захватывая данные. Вот мой PHP ver и ASP ver, насколько я мог его преобразовать.

<-- php setSession.php works fine --> 
$data = $_POST['data']; 
foreach ($data['sessionData'] as $key => $value) { 
$projectProduct = "1"; 
$level = $value["Level"]; 
$menuName = $value["MenuName"]; 
$state = $value["State"]; 
$_SESSION['PID:'.$projectProduct][$level][$menuName]['menu_state'] = $state; 
echo "[PID:".$projectProduct."][".$level."][".$menuName."][".$state."]<br>"; 
} 
0 =>>>>> Array<br>[PID:1][Main][Kitchen][CHECKED] 

Здесь я хочу сделать то же самое в ASP

' setSession.asp 
data = Request.Form("data") 
For Each part In data("sessionData") 
projectProduct = part("PID") 
level = part("Level") 
menuName = part("MenuName") 
state = part("State") 
Session("PID:" & projectProduct).Item(level).Item(menuName).Remove("menu_state") 
Session("PID:" & projectProduct).Item(level).Item(menuName).Add "menu_state", state 
response.write("[PID:" & projectProduct&"]["&level&"]["&menuName&"]["&state&"]<br>") 
Next 

выводит пустой

Похоже, он никогда не имеет каких-либо данных, но не бросать какие-либо ошибки. Я правильно читаю объект POST?

[править]

Вот данные RAW POST захваченный из Скрипач:

data%5BsessionData%5D%5B0%5D%5BPID%5D=1&data%5BsessionData%5D%5B0%5D%5BLevel%5D=Main&data%5BsessionData%5D%5B0%5D%5BMenuName%5D=Kitchen&data%5BsessionData%5D%5B0%5D%5BState%5D=CHECKED 

здесь я использовал URL Decode на этом string-

data[sessionData][0][PID]=1&data[sessionData][0][Level]=Main Level Plan&data[sessionData][0][MenuName]=Kitchen&data[sessionData][0][State]=CHECKED 

Это выглядит как я должен теперь можно провести петлю через строки, используя

For Each part In Request.Form("data[sessionData]") 

, но ничего не происходит. Я добавил простой цикл, чтобы посмотреть на Request.Form и вот что он видит:

for each x in Request.Form 
    Response.Write(x) 
Next 
' outputs -> data[sessionData][0][PID]data[sessionData][0][Level]data[sessionData][0][MenuName]data[sessionData][0][State] 

Я предполагаю, что это сводится к просто прочитывая и обработка этой строки правильно, или несколько, если более чем один отправлено. Верный?

+1

Это помогло бы, если бы мы могли видеть RAW HTTP POST отправляется на страницу ASP, вы можете захватить с помощью Fiddler? – Lankymart

+0

Это все, что посылает Fiddler - BYPES BYPES (by Content-Type) -------------- ~ headers ~: 252 текст/html: 20 – user1601513

+0

и это первые строки от Скрипач - Request Count: 1 Bytes Sent: 1446 \t \t (заголовки: 1240, тело: 206) Bytes Received: 272 \t \t (заголовки: 252, тело: 20) – user1601513

ответ

3

Выход RAW определенно помогает выработать то, что происходит.

Что происходит, то jQuery преобразует структуру JSON в параметры HTTP POST, но во время процесса создает некоторые слишком сложные имена ключей.

Если сломать ключевые пары значений у вас есть что-то вроде

data[sessionData][0][PID]=1 
data[sessionData][0][Level]=Main Level Plan 
data[sessionData][0][MenuName]=Kitchen 
data[sessionData][0][State]=CHECKED 

Насколько классический ASP является заинтересованным это просто набор строк ключа и значения пара и больше ничего.

Правильный подход к определению того, что эти ключи предназначены для того, чтобы делать то, что вы сделали в вопросе, но с некоторыми незначительными изменениями.

For Each x In Request.Form 
    Response.Write(x) & "=" & Request.Form(x) & "<br />" 
Next 

Который при выводе в формате HTML будет выглядеть так же, как показано выше.

Вооруженные знаниями о том, какие ключи вы должны иметь возможность ссылаться на них непосредственно из коллекции Request.Form().

Dim pid: pid = Request.Form("data[sessionData][0][PID]") 
Response.Write pid 

Выход:

1 
+0

По-прежнему не удается получить доступ к другим значениям, которые передаются по ссылке на имена ключей, такие как response.write ("Level =>" & part ["Level"]). Выдает внутреннюю ошибку сервера – user1601513

+1

@ user1601513 Я думал, что объяснил, что такое ключи? Значение 'level' сохраняется в ключе' data [sessionData] [0] [Level] ', поэтому для его вывода вы будете использовать' Response.Write Request.Form ("data [sessionData] [0] [Level]") '. Помните, что ключ - это просто строковое значение, которое ничего не выводится, это просто строка, которая используется в качестве ключа для идентификации определенной части данных, которая была опубликована. – Lankymart

+0

, но теперь это выводит «[Уровень]», но мне нужно получить «Главное». pid = Request.Form ("data [sessionData] [0] [Pid]") level = pid & "[Level]" response.write (level) – user1601513