2017-02-01 19 views
0

Нелегкое время с обновлением таблицы SQL из HTML-формы, сгенерированной на asp-classic странице. Страница динамически создает таблицу на основе SQL-запроса; Я добавил форму для редактирования некоторых полей, отображаемых в таблице, но не смог вызвать функцию (то есть onclick), которую вызывает кнопка формы, используя приведенный ниже код. Я пробовал несколько вариантов синтаксиса, используемых для вызова функции через VBscript, и я ничего не пропустил. Мне интересно, пытаюсь ли я сделать что-то, что не может быть сделано в asp-classic среде из-за используемого кода на стороне сервера и ограничений, которые идут с этим (а также я пытаюсь использовать одну и ту же страницу для генерации результаты). Я знаю, что поведение по умолчанию для формы - это обновление страницы, если я не укажу другую страницу. В приведенном ниже коде я просто пытаюсь подтвердить поведение, прежде чем добавить инструкцию SQL в функцию. (Я обычно только извлечения или вставки данных для веб-сайта. - очень мало опыта обновления данных между одной страницы, как это)Вызов функции vbscript для обновления таблицы SQL из HTML-формы, сгенерированной на странице asp-classic

<br> 
<form method="POST" id="form" action=""> 
<table> 
    <tr> 
     <td> 
      <select name="state"> 
<% 
'populate the dropdown selection for the state within the form 
do until rs.eof 
    For each x in rs.fields 
     response.write "<option value=" & x.Value & ">" & x.Value & "</option>" & vbNewLine 
    next 
    rs.movenext 
loop 
%> 
      </select> 
     </td> 
     <td> 
      <select name="ps"> 
       <option value="blank"></option> 
       <option value="prime">Primary</option> 
       <option value="secondary">Secondary</option> 
      </select> 
     </td> 
     <td> 
      <input name="emp_num" size="5" maxlength="5" rows="1" ></textarea> 
     </td> 
     <td> 
      <input type="submit" onclick="Go" value="Update record"/> 
     </td> 
    </tr> 
</table> 
</form> 

<% 
function Go() { 

msgbox "test" 
//additional SQL code would be included here once the function actually works 
} 
%> 

<% 
'close the DB connection 
dbconn.close 
%> 

</body> 
</html> 
+1

Да, вы не можете вызвать код на стороне сервера (функция go) из кода на стороне клиента (onlcikc). То, что вы обычно делаете, это отправить форму, чтобы снова вызвать страницу или другую страницу, затем получает поля и работает SQL, а затем передает пользователю обновленные данные или статус представления. – Dijkgraaf

ответ

0

Вы пытаетесь смешать код на стороне сервера с клиентской стороны код, и он не работает так TM.

Вот очень грубая схема того, как вы могли получать информацию от пользователя, обрабатывать его и отображать на нем все на одной странице asp. Обратите внимание на полное отсутствие JavaScript. :)

<html> 
<head> 
<title>My Page</title> 
<link rel="stylesheet" type="text/css" href="css/stylestuff.css"> 
<% 
Dim rs, sql, conn 
Dim mylist, myval1, myval2, i 

myval1 = Request.Form("val1") 
myval2 = Request.Form("val2") 
'- If the form hasn't been submitted yet, myval1&2 will be the special value Empty, 
'- but you can treat them as a blank string ("") for all intents and purposes. 
If Validate(myval1, myval2) = True and myval1 & myval2 <> "" Then 
    DoStuffWith myval1, myval2 
End If 
%> 
</head> 
<body> 
<h1>My Page</h1> 
<form method="post" action=""> 
<p>Select one: <select name="val1" size="1"> 
    <% 
    ListStuff mylist 
    For i = 0 to UBound(mylist,1) 
     response.write "<option value='" & mylist(0,i) & "'" 
     If myval & "" = mylist(0,i) & "" Then response.write " selected" 
     response.write ">" & mylist(1,i) & "</option>" 
    Next 
    %> 
    </select></p> 
<p>Write something here: 
    <input type="text" name="val2" value="<%=myval2%>" size="10"></p> 
<p><input type="submit" name="btn" value="Submit"></p> 
</form> 
<% 
If myval1 & myval2 <> "" Then 
    DisplayStuff myval1, myval2 
End If 
%> 
</body> 
</html> 
<% 
Sub ListStuff(L) 
    sql = "Select [...] From [...] Where [...]" 
    Set rs = Server.Createobject("ADODB.Recordset") 
    rs.Open sql, "connection string (or previously-opened connection object)", 1,2 
    If Not rs.EOF Then 
     L = rs.GetRows 
    Else 
     Redim L(1,0) 
     L(0,0) = 0 : L(1,0) = "missing!" 
    End If 
    rs.Close 
    Set rs = Nothing 
End Sub 
'--------------------------------- 
Function Validate(v1,v2) 
dim f 
    f = True 
    If Not Isnumeric(v1) Then f = False 
    If Len(v2) > 10 Then f = False 
    Validate = f 
End Function 
'--------------------------------- 
Sub DoStuffWith(v1,v2) 
    '- table-creation (or whatever) code goes here 
End Sub 
'--------------------------------- 
Sub DisplayStuff(v1,v2) 
    '- display code goes here 
End Sub 
%> 
+0

. Хорошо, я Думаю, я следую логике. Все выполняется на первоначальном рендеринге страницы, и при загрузке обрабатывается только «предварительно заполненная» форма. У меня есть 3 значения на форме. Должен ли я передать все три значения в –

+0

подпрограмму (то есть больше, чем просто myval на Sub DoStuffWith)? Я привык видеть аргумент в круглых скобках для этого типа функции (где вы можете передавать несколько аргументов, просто разделяя их запятыми); в попытке сделать это с вашей подпрограммой, я получаю ошибки. Все, что я видел с помощью веб-поиска, использует структуру круглых скобок. –

+0

Чтобы передать несколько значений подпрограмме, вы * do * просто разделите их запятыми: 'dim myval1, myval2' ...' DisplayStuff myval1, myval2' ... 'Sub DisplayStuff (v1, v2)'. Для функции синтаксис вызова слегка меняется: 'If Validate (myval1, myval2) Then' (обратите внимание на круглые скобки). Если у вас много полей в форме (скажем, дюжина или более), вы можете просто использовать глобальные переменные: 'dim myval1, myval2' ...' DisplayStuff' ... 'Sub DisplayStuff()' (а затем переписывайте субтитры, чтобы использовать 'myval1', а не' v1'). – Martha

 Смежные вопросы

  • Нет связанных вопросов^_^