0

在做了一些研究并致力于 CF 2016 之后,我发现了一个问题。我使用 JQuery/Ajax 提交表单数据。;如果我在符号转换为的文本区域之一中输入半列&#59。我不确定是什么导致半列转换为 HTML 代码。我在提交之前检查了数据表单,如果我Test;在控制台中输入,这将如下所示:Test%3B。然后我在我的 cffunction 顶部的 cfmail 中转储了表单范围,表单字段值如下所示:Test&#59;这是我创建的 HTML/JQuery 代码的示例:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=10; IE=11" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
        <title>Test Page</title>
        <script type="text/javascript" src="JQuery/jquery-3.2.1.min.js"></script>
        <script type="text/javascript" src="JQuery/jquery-ui.js"></script>
    </head>
    <body>
        <div id="myContainer">
            <form name="myForm" id="myForm" method="POST" action="#" class="frmSubmitData">
                <fieldset>
                    <legend>Test Form</legend>
                    <div>
                        <span style="display: inline-block; vertical-align:top; font-weight:bold;">Comments:</span>
                        <textarea name="my_comments" id="my_comments" row="2" cols="55" required></textarea>
                    </div>
                    <div>
                        <input type="submit" name="frmSubmit" id="frmSubmit" value="Submit" />
                    </div>
                </fieldset>
            </form>
        </div>
        <script>
            $('.frmSubmitData').on('submit', function(e){
                e.preventDefault();
                var formData = $('#myForm').serialize();
                console.log(formData);

                $.ajax({
                    type: 'POST',
                    encoding:"UTF-8",
                    url: 'Components/myTest.cfc?method=testForm',
                    data: formData,
                    dataType: 'json'
                }).done(function(obj){
                    if(obj.STATUS === 200){
                        console.log(obj.FORMDATA);
                    }else{
                        alert('Error');
                    }
                }).fail(function(jqXHR, textStatus, errorThrown){
                   alert("Error: "+errorThrown);
                });
            });
        </script>
    </body>
</html>

和冷融合功能的例子:

<cfcomponent>
    <cfsetting enablecfoutputonly="yes" showdebugoutput="no" requesttimeout="3600">

    <cffunction name="testForm" access="remote" output="true" returnformat="JSON">
        <cfmail to="myemail@gmail.com" from="myemail@gmail.com" subject="Test Form Scope" type="text">
            <cfloop collection="#form#" item="theField">
                <cfoutput>#theField# = #form[theField]#<br></cfoutput>
            </cfloop>
        </cfmail>

        <cfset fnResults = StructNew()>
        <cfset fnResults.message = "Record successfully saved.">
        <cfset fnResults.status = "200">
        <cfset fnResults.formdata = #FORM#>

        <cfreturn fnResults>
    </cffunction>
</cfcomponent>

在我完成此代码之前的一个注释在 CF10 上运行良好,一旦我们升级到 CF 2016,这个问题就出现了。之前再次使用了完全相同的客户端代码,并且未转换半列宪章。如果有人遇到同样的问题并且知道如何解决这个问题,请告诉我。谢谢!

4

1 回答 1

1

你有一个编码问题!这很难理解,但通常很容易解决。通常添加<meta charset="utf-8" />到您的 HTML 头部就足够了。这要求访问浏览器以易于理解的编码格式发布。您可能想要搜索您的代码库并查找除 UTF-8 之外的任何类型的编码。

也可能发生某种编码,例如运行两次的安全保护措施(一次在数据库之前,一次在数据库返回之后)。检查一下。它应该是 EncodeForHtml(),它应该只在打印到页面时执行,而不是在它进入数据库之前执行。直接去数据库看看它是否在被插入数据库之前被编码——不要只看页面上的输出。这将为您提供有关它发生在哪里的线索。

于 2018-01-30T20:54:57.530 回答