Классический ASP: я получаю сообщение об ошибке несоответствия типов, когда не должен

У меня есть функция для превращения закодированного в HTML текста обратно в HTML. Обычно он прекрасно работает, но по какой-то причине я сегодня пытаюсь использовать его для некоторого текста и получаю следующую ошибку:

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'UnChkString'

/manage/solutions_delete.asp, line 22

Строка, на которой я использую эту функцию:

<%= UnChkString(solution_desc) %>

Переменная solution_desc:

&lt;p&gt;Here is a description of what this solution is all about.&lt;/p&gt;

Поле, из которого база данных извлекает solution_desc, является текстовым полем.

Моя функция UnChkString:

Function UnChkString(string)
    UnChkString = Replace(string,"[%]","%")
    UnChkString = HTMLDecode(UnChkString)
End Function

Функция HTMLDecode:

Function HTMLDecode(sText)
    Dim I
    sText = Replace(sText, "&amp;" , Chr(38))
    sText = Replace(sText, "&amp;" , "&")
    sText = Replace(sText, "&quot;", Chr(34))
    sText = Replace(sText, "&rsquo;", Chr(39))
    sText = Replace(sText, "&lt;"  , Chr(60))
    sText = Replace(sText, "&gt;"  , Chr(62))
    sText = Replace(sText, "&nbsp;", Chr(32))
    For I = 1 to 255
        sText = Replace(sText, "&#" & I & ";", Chr(I))
    Next
    HTMLDecode = sText
End Function

ИЗМЕНИТЬ

Я даже пробовал:

<%= UnChkString(CStr(solution_desc)) %>

без везения.


person James    schedule 08.03.2012    source источник
comment
@bfavaretto <%= UnChkString(solution_desc) %>   -  person James    schedule 08.03.2012
comment
Может быть, вы получаете NULL из БД? Происходит ли ошибка с строкой примера, которую вы опубликовали?   -  person bfavaretto    schedule 08.03.2012
comment
@bfavaretto Строка, которую я разместил, — это то, что я получаю из базы данных. Вот что пишет если не пробую запустить через функцию.   -  person James    schedule 08.03.2012
comment
Очень странно. Я могу нормально запустить его на своей машине, без ошибок!   -  person bfavaretto    schedule 08.03.2012


Ответы (4)


Иногда лучше просто очень внимательно перечитать ошибку. Рассмотрим этот фрагмент VBS:

 DoStuff("Hello World")

Поскольку DoStuff не определено и нет Option Explicit, я получаю:

Ошибка: несоответствие типов: "DoStuff"

Ваша ошибка: Type mismatch: 'UnChkString'. Он не жалуется на передаваемый параметр, а жалуется на сам UnChkString. Я предполагаю, что вы допустили самые элементарные ошибки программирования на VBScript, у вас нет Option Explicit в начале вашего кода. Это обязательно.

По непонятным причинам из кода, который вы разместили до сих пор, код в точке, где выполняется <%= UnChkString(solution_desc) %>, обработчик сценариев не имеет функции UnChkString, поэтому вы видите ошибку. Я подозреваю, что включение Option Explicit выявит проблему (а также заставит вас Dim использовать все ваши переменные).

person AnthonyWJones    schedule 08.03.2012
comment
Я начал отвечать, говоря, что хотел бы, чтобы это было так просто, но скрипт функций автоматически загружается на каждую страницу, но потом все равно проверяется. Это было причиной. Сценарий моих функций не был включен на эту конкретную страницу. Спасибо. - person James; 10.03.2012

Я согласен с мнением Энтони о том, что вам следует использовать Option Explicit в верхней части ваших ASP-страниц.

Я подозреваю, что причина в отсутствующем или неправильно сформированном включаемом файле.

Я могу воспроизвести это с помощью кода ниже, где я либо удаляю

<!--#include file="include-functions.asp"-->

или исказить вызов, изменив его на

<!-#include file="include-functions.asp"-->


include-functions.asp
<%
Function UnChkString(string)     
UnChkString = Replace(string,"[%]","%")     
UnChkString = HTMLDecode(UnChkString) 
End Function 
%>


index.asp
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
    <!--#include file="include-functions.asp"-->
<%

Dim solution_desc
solution_desc = "&lt;p&gt;Here is a description of what this solution is all     about.&lt;/p&gt;"


Function HTMLDecode(sText)     
Dim I     
sText = Replace(sText, "&amp;" , Chr(38))     
sText = Replace(sText, "&amp;" , "&")     
sText = Replace(sText, "&quot;", Chr(34))     
sText = Replace(sText, "&rsquo;", Chr(39))     
sText = Replace(sText, "&lt;"  , Chr(60))     
sText = Replace(sText, "&gt;"  , Chr(62))     
sText = Replace(sText, "&nbsp;", Chr(32))     
For I = 1 to 255         
sText = Replace(sText, "&#" & I & ";", Chr(I))     
Next     
HTMLDecode = sText 
End Function 

%>
<%= UnChkString(solution_desc) %> 
</body>
</html>
person Nicholas Murray    schedule 09.03.2012

Замените string на vStr и немного измените.

Попробуйте так: -

Function UnChkString(vStr)
    vStr = Replace(vStr,"[%]","%")
    UnChkString = HTMLDecode(vStr)
End Function
person Siva Charan    schedule 08.03.2012
comment
Забыл упомянуть, что я уже пробовал это (конечно, с другой переменной), но безуспешно. Все равно попробовал еще раз, но все равно то же самое. - person James; 08.03.2012

Чтобы исправить это, вам нужно сначала проверить, есть ли в строке символ, сделайте это.

Function HTMLDecode(byVal sText)
    HTMLDecode = sText
    If Instr(HTMLDecode,"&amp;") Then HTMLDecode = Replace(HTMLDecode, "&amp;" , Chr(38))
    If Instr(HTMLDecode,"&amp;") Then HTMLDecode = Replace(HTMLDecode, "&amp;" , "&")
    If Instr(HTMLDecode,"&quot;") Then HTMLDecode = Replace(HTMLDecode, "&quot;", Chr(34))
    If Instr(HTMLDecode,"&rsquo;") Then HTMLDecode = Replace(HTMLDecode, "&rsquo;", Chr(39))
    If Instr(HTMLDecode,"&lt;") Then HTMLDecode = Replace(HTMLDecode, "&lt;"  , Chr(60))
    If Instr(HTMLDecode,"&gt;") Then HTMLDecode = Replace(HTMLDecode, "&gt;"  , Chr(62))
    If Instr(HTMLDecode,"&nbsp;") Then HTMLDecode = Replace(HTMLDecode, "&nbsp;", Chr(32))

    For I = 1 to 255
        If Instr(HTMLDecode, "&#" & I & ";") Then HTMLDecode = Replace(HTMLDecode, "&#" & I & ";", Chr(I))
    Next
End Function

И..

 Function UnChkString(vStr)
     UnChkString = vStr
     If Instr(vStr,"[%]") Then vStr = Replace(vStr,"[%]","%")
 End Function

Это должно решить вашу проблему Type Mismatch. Не спрашивайте меня, почему, это просто работает.

person Control Freak    schedule 09.03.2012