Response.Write 中的经典 ASP 子过程调用
Posted
技术标签:
【中文标题】Response.Write 中的经典 ASP 子过程调用【英文标题】:Classic ASP sub procedure call in Response.Write 【发布时间】:2010-11-22 18:29:01 【问题描述】:我有一个经典的 ASP 问题。
尝试这样做:记录集是从 1995 年到 2020 年的简单年份列表;我正在尝试将 2010(当年)作为下拉菜单中的默认选择。
问题:我试图在“Response.Write”中调用 Sub proc,但它一直给我这个错误:
“错误'800a000d'类型不匹配:'selectyear'”
下面是代码,尝试 1 没有任何问题。但是,当我将“if”逻辑移动到子过程并在 Request.Write 中调用它时,它给了我错误。
谁能解释为什么 Attempt1 有效而 Attempt2 无效。
' Attempt 1:
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td> <td> <select name='theyear' style=""WIDTH: 67px"">"
dim selyr
while not rsYEAR.EOF
if CINT(rsYEAR.fields("year")) = year(now) then
selyr = "selected"
else selyr = ""
end if
Response.Write"<option value='" & rsYEAR.fields("year") & "' "& selyr &" >" & cstr(rsYEAR.Fields("year"))
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
rsYEAR.Close
' Attempt 2:
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td> <td> <select name='theyear' style=""WIDTH: 67px"">"
dim selyr2
while not rsYEAR.EOF
Response.Write "<option value='" & rsYEAR.fields("year") & "' " & cstr(selectyear(cint(rsYEAR.fields("year")))) &" >" & cstr(rsYEAR.Fields("year"))
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
'close and clean up
rsYEAR.Close
set rsYEAR = nothing
非常感谢您的回复。 谢谢你, 湿婆
【问题讨论】:
【参考方案1】:我猜cint(rsYEAR.fields("year"))
正在抛出错误,因为存在无法转换为int
的数据。不过,我希望这两种情况都会发生。
在第二次尝试中你不应该需要cstr(selectyear(cint(rsYEAR.fields("year"))))
中的cstr
,因为我假设selectyear
已经返回了一个字符串。你能显示selectyear
的代码吗?
【讨论】:
感谢您的响应。SQL 输出只是年份列表。我尝试在 SUB 调用之前使用“cstr”进行转换,但这仍然给了我同样的错误。 这里是 Selectyear 的代码:sub selectyear(yr) if yr = year(now) then Response.Write "selected" else Response.Write "" end if end sub 啊 - 你不应该Response.Write
selectyear
中的值,你应该从 selectyear
函数返回值,因为你将值传递给'cstr'(你不'不需要做),然后将其连接到另一个字符串,然后得到输出。
所以让 selectyear 变成这样:function selectyear(yr) if yr = year(now) then selectyear = "selected" else selectyear = "" end if end function
【参考方案2】:
(怎么这么久都没有正确答案?)
Sub 没有值,所以你不能 Response.Write 它。您需要使用函数,或者将 Sub 调用放在单独的行中。
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td><td><select name='theyear' style=""width: 67px"">"
dim y
while not rsYEAR.EOF
y = rsYEAR.fields("year")
Response.Write "<option value='" & y & "'" & IsCurr(y) & ">" & y & "</option>"
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
rsYEAR.Close
Function IsCurr(yr)
if Cstr(yr) = Cstr(year(now)) then
IsCurr = " selected"
else
IsCurr = ""
end if
End Function
使用 sub 而不是函数,这会变成
rsYEAR.Open qYEAR, objconn, 0, 1
response.Write "<tr><td>Year:</td><td><select name='theyear' style=""width: 67px"">"
dim y
while not rsYEAR.EOF
y = rsYEAR.fields("year")
Response.Write "<option value='" & y & "'"
IsCurr y
Response.Write ">" & y & "</option>"
rsYEAR.MoveNext
wend
response.Write "</select></td></tr>"
rsYEAR.Close
Sub IsCurr(yr)
if Cstr(yr) = Cstr(year(now)) then
Response.Write " selected"
end if
End Sub
【讨论】:
以上是关于Response.Write 中的经典 ASP 子过程调用的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET - 停止/解决方法 Response.Write() 的异步行为
使用 jquery 和经典 asp 在服务器端生成 HTML 文档