У меня есть некоторые значения Session, которые я постоянно изменяю с помощью вызовов Ajax. Кажется, я не могу обработать данные POST, чтобы обработать его и установить значения.
То, что я передаю ему здесь, представляет собой массив строк, как показано в моем коде ниже.
Здесь 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, полученные от Fiddler:
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 для этой строки,
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]
Я предполагаю, что это сводится к простому чтению и обработке этой строки правильно, или несколько, если отправлено более одного. Верный?
Выход 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