【问题标题】:How do I pass a form value to different redirect pages?如何将表单值传递给不同的重定向页面?
【发布时间】:2016-12-13 14:54:30
【问题描述】:

我刚刚开发了一个平台,可以在使用如下所示的表单提交 ID 号后立即打印单个 ASP 文档:

<form action="http://localhost/teg/f1.asp" method="POST">
        <input type="number" name="number" placeholder="Please Enter ID" />
        <button type="submit">Print</button>        
</form>

在这种情况下,它正在打印一个名为 f1.asp 的文档。但是,我也有 f2.asp,所以我没有为两个单独的字段编写两次表单,而是决定编写一次表单并包含一个下拉列表,让用户选择要打印的内容,但为此我想我需要另一个页面我称之为重定向。表单变化如下:

<form action="http://localhost/teg/redirect.asp" method="POST" id="new">
        <input type="number" name="number" placeholder="Please Enter ID" />
        <button type="submit">Print</button>        
</form>
<label> Type </label>
<select name="list" form="new">
<option value="1">f1</option>
<option value="2">f2</option>  
</select>

重定向的 ASP 页面看起来:

<html>
<body>
<%            
    Dim list
    list = request.form("list")
If list=1 Then response.redirect("f1.asp") Else If list=2 Then      response.redirect("f2.asp") End If
 %>

最后,当使用下拉列表单击打印时,它会完美重定向,但 ID 号字段中的“数字”值未达到用户选择的文档类型,因此无法正确显示文档。相反,会出现以下数据库引擎错误:“80040e10”。任何帮助,将不胜感激。

【问题讨论】:

  • 您在重定向时丢失了number 表单发布参数。在重定向页面中,将Request.Form("number") 存储在一个变量中,然后将该变量传递给重定向Response.Redirect "fi.asp?" &amp; yourvar。另一种可行的方法是Server.Transfer,它不会进行硬重定向,并允许您使用表单发布参数。

标签: forms redirect iis vbscript asp-classic


【解决方案1】:

请务必记住,HTTP 是无状态的,它仅通过 Cookie 等技术允许 Classic ASP 跨 HTTP 请求将值存储在 Session 对象中。

目前由于Response.Redirect(),发送新请求时Request.Form("number") 的值丢失。有几种方法可以解决此问题,我将在这里重点介绍三种。

1。通过重定向作为查询字符串传递值

最简单的方法是传递使重定向页面正常工作所需的值。

<%
'Assign our form values to local variables.
Dim list: list = Request.Form("list") & ""
Dim id: id = Request.Form("number") & ""

'Check the value contain data and they are valid numeric values.
If Len(list) > 0 And IsNumeric(list) Then list = CLng(list) Else list = 0
If Len(id) > 0 And IsNumeric(id) Then id = CLng(id) Else id = 0

'***** Only process if we have valid values to build the redirect. *****
Dim url
If list > 0 And id > 0 Then
  'We have valid values build our URL that we will use in
  'the redirect call.
  url = "f" & list & ".asp?id=" & id     
Else
  'Something not right with request go back to the form page.
  'Setting this will send the page back to the form page when the
  'redirect is called.
  url = "formpage.asp"
End If

'Make the redirect request.
Call Response.Redirect(url)
%>

然后在重定向页面中使用Request.QueryString("id")调用id查询字符串值。


2。使用Server.Transfer()方法

在某些情况下,您可以使用此方法来简化代码。简单来说,不是将其重定向,而是将请求的页面“缝合”到当前请求的底部,从而允许表单参数仍然可以访问,因为从技术上讲,就 Internet 浏览器而言,它仍然是相同的请求。

<%
Dim list: list = Request.Form("list") & ""
Dim id: id = Request.Form("number") & ""
If Len(list) > 0 And IsNumeric(list) Then list = CLng(list) Else list = 0
If Len(id) > 0 And IsNumeric(id) Then id = CLng(id) Else id = 0

If list > 0 And id > 0 Then
  Call Server.Transfer("f" & list & ".asp")
Else
  'Handle invalid request here
End If
%>

您可以在传输的页面中使用来自Request 对象的任何值,例如.FormQueryString,而不会发生错误,因为就服务器而言,它们仍然是同一个页面。

3。将值存储在Session 对象中

如果您在 IIS 中将 Enable Session State 设置为 True,您可以在 Session 对象内跨请求存储值(经典 ASP 使用会话 Cookie 来维护服务器内存中的会话状态) .

<%
Dim list: list = Request.Form("list") & ""
Dim id: id = Request.Form("number") & ""
If Len(list) > 0 And IsNumeric(list) Then list = CLng(list) Else list = 0
If Len(id) > 0 And IsNumeric(id) Then id = CLng(id) Else id = 0

If list > 0 Then
  'Store the value we want to persist in the Session.
  Session("PrintId") = id
  Call Response.Redirect("f" & list & ".asp")
Else
  'Handle invalid request here.
End If
%>

然后使用varname = Session("PrintId") 将值返回到重定向页面中。

【讨论】:

  • 谢谢!优秀的代码。我尝试了第一种方法,但由于某种原因,单击按钮后总是显示表单页面。
  • @AlexanderLopez 这是因为它假定 listnumber 的值是数字,如果不是,它们被设置为 0 并且不通过检查 If list &gt; 0 And id &gt; 0 Then。跨度>
  • 我实际上是在尝试通过输入数据库中的真实 ID 号来打印其中一个文档,我认为这是代码通过检查的唯一方法。但是,数据提交后是否仍然可以立即获取表单页面?
  • @AlexanderLopez 如果您查看我提供的代码,是的,如果listnumber 的值都是0 (请注意If 语句Else你会看到它重定向到formpage.asp)。如果您不希望它这样做,请从 Else 中删除该重定向,但您可能会传递不正确的数据。如果Request.Form("list")Request.Form("number") 的值不都是数字,那么我将清理表单输入,然后将它们设置为0,然后在尝试重定向之前对其进行检查。我在示例 1 中添加了一些 cmets 来尝试澄清。
【解决方案2】:

当天晚些时候,但更简单一点。无需进行重定向,只需使用操作 URL 和所有数据填充一个新表单,然后在验证后使用 JS 提交触发提交。不利的一面是 JS 可能会被破坏,但随后会进行捕获,以及替代选项。延迟回复的原因是因为我一直在寻找类似的东西,直到我意识到重定向是不必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多