【问题标题】:Classic ASP sub procedure call in Response.WriteResponse.Write 中的经典 ASP 子过程调用
【发布时间】: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

非常感谢您的回复。 谢谢你, 湿婆

【问题讨论】:

    标签: asp-classic


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 2023-04-01
      相关资源
      最近更新 更多