【问题标题】:When data fails first validation, all subsequent submissions fail, even if valid data is submitted当数据第一次验证失败时,所有后续提交都失败,即使提交了有效数据
【发布时间】:2014-04-04 15:54:12
【问题描述】:

我正在使用一个较旧的 JSP 应用程序。 modalDialog 有一个自定义构建道场。 用户输入应用程序并将信息输入表单。 当需要添加新学生时,他们会进入一个模式对话框,他们可以在其中添加编辑从数据库填充的列表。 进行更改后,它们可以保存(在模式对话框关闭之前保存到数据库。)只要它们通过验证。

原始表单完成后,他们会提交表单以进行额外验证。 用户通过关闭模式对话框而不保存来绕过编辑学生页面上的验证。 我提取了更新的信息 (dojo.xhrGet) 并将其存储在隐藏元素中,以便可以在提交时验证更新/未更改的学生信息。

div 填充了隐藏的 html 输入元素,并且它们验证得很好。 除非用户在查看/添加/更改 modalDialog 页面中的信息之前点击提交,并且他们收到阻止提交的错误。 如果他们随后返回到无法提交的模式对话框,则在第一次提交失败后,复选框不会验证为 true 或在任一页面上选中。 我们可以在列表中添加/编辑学生,并为学生列表选择一个“必须签名”的最低要求。

我已经搜索了一段时间,但没有找到任何与我真正遇到的问题相同的问题。

堆栈溢出标题“使用 dojo.xhrGet 更新表单字段导致 dijit.checkbox 为只读”尝试更改为 dojo.place(),但这并没有改变任何内容。

我查看了复选框,因为这似乎是在捕捉验证错误。它们被选中,但它们被验证为假。 堆栈溢出标题“单击时我的复选框不会检查”

我发现另一个似乎类似的问题,没有代码示例我不确定如何继续更改我自己的代码。 堆栈溢出标题“Struts2 验证 - 验证失败时重新填充子项”

当提交验证失败时,它不会加载从 dojo.xhrGet 返回的 div 元素。表单验证布尔值失败。

我只在模态对话框中包含了与学生有关的验证部分:

<script type="text/javascript">

function validateForm()
{
   //Other non-relevant validation for this page removed from example.

    var errors = [];
    var form = dojo.byId("studentForm");

    <s:if test="work.isTeam">   
        var index = 0;
        var hasStudent = false;
        var hasPermission = false;

        while (true)
        {
            if (!dojo.byId("student" + index + ".name"))
            {
                break;
            } 
            else
            {
                hasStudent = true;
                if (form.elements.namedItem("student" + index + ".mustSign").checked == "true")
                {
                    hasPermission = true;
                }
            }
            index++;
        }
        if (!hasStudent)
        {
            errors[errors.length]="At least 1 student is required.";
        }
        if (!hasPermission)
        {
            errors[errors.length]="At least 1 student must be able to sign.";
        }
    </s:if>
}
<script>

打开模态对话框的主表单脚本和提交时调用的 refreshStudents() 函数。

<td align="center">
    <input type="button" name="Checkin" value="Complete" onclick="dojo.byId('completing').value='true'; refreshStudents(); validateForm();"/>
</td>

主页面的验证几乎相同。 唯一的区别是我们收集 must sign 的值,因为它是从 dojo.xhrGet 返回的文本元素

<script type="text/javascript">

    function editStudents()
     {
        try 
        {
            turnOffDojo();

            var classId = dojo.byId("classId").value;
            var url = "<s:url action='ShowStudents' namespace='/files' includeParams='none'/>?classId=" + classId;
            openModalDialog("StudentsDialog", url, "students", 550, 300);

        }
        catch (Exception)
        {
            createDojoAlert("Edit students (error)", Exception);
        }
    }

    function refreshStudents() 
    {
        <s:if test="work.isTeam">           
            var loopTR = document.createElement("TR");
            loopTR.innerHTML="Loading Data..."; 

            dojo.byId("studentsDiv").innerHTML="";
            dojo.byId("studentsDiv").appendChild(loopTR);

            var classId = dojo.byId("classId").value;
            var url = "<s:url action='LoadStudents' namespace='/files' includeParams='none'/>?classId=" + classId;

            dojo.xhrGet({
                preventCache: true,
                url: url,
                load: function(result) 
                {
                    try 
                    {
                        loopTR.innerHTML="";
                        dojo.byId("studentsDiv").innerHTML= result;
                    }
                    catch (Exception) 
                    {
                        createDojoAlert("Refresh students (catch block)","<li>Error: " + Exception + "</li>");
                    }
                },
                error: function(error) 
                { 
                    createDojoAlert("Refresh students (dojo error)","<li>Error: " + error + "</li>");
                }
            });
        </s:if >
    }

<script>

【问题讨论】:

    标签: javascript validation struts2 dojo modal-dialog


    【解决方案1】:

    更新如下:

    Dom cleanup -- 删除在 refreshStudents() 中使用 innerHTML,因为它可能导致 getElementById() 出现问题。参考(Why is "element.innerHTML+=" bad code?) 去除不必要的变量。添加了 handleAs 以便页面知道如何处理响应并设置超时。

    更新到 HTML 以仅在工作与团队工作相关时调用 refreshStudents()。在团队工作相关的情况下,仅在 refreshStudents() 成功响应后调用 validateForm()。如果团队合作与工作类型无关 工作然后 validateForm()。

    function refreshStudentsAndValidate() 
    {
        <s:if test="work.isTeam">           
            dojo.byId("studentsDiv").innerHTML="";
    
            var classId = dojo.byId("classId").value;
            var url = "<s:url action='LoadStudents' namespace='/files' includeParams='none'/>?classId=" + classId;
    
            dojo.xhrGet({
                url: url,
                handleAs: "text",
                timeout: 10000, //Time in milliseconds (10 secs)
                load: function(result) 
                {
                    try 
                    {
                        dojo.html.set(dojo.byId("studentsDiv"), result);
                        // now call validation...
                        validateForm();
                    }
                    catch (Exception) 
                    {
                        createDojoAlert("Refresh students (catch block)","<li>Error: " + Exception + "</li>");
                    }
                },
                error: function(error) 
                { 
                    createDojoAlert("Refresh students (dojo error)","<li>Error: " + error + "</li>");
                }
            });
        </s:if >
    }
    

    对HTML的更新如下,使用struts2:

    <td align="center">
        <input type="button" class="button" name="Checkin" value="Complete" onclick="dojo.byId('completing').value='true'; <s:if test="work.isTeam"> refreshStudentsAndValidate();</s:if><s:else> validateForm(); </s:else>" />
    </td>
    

    总之,根本原因是 refreshStudents() 函数。由于使用 dojo.xhrGet 发出异步请求,页面在执行验证代码之前没有收到响应。因为我们只需要检查学生工作与团队相关的情况,因此添加了 struts2 if/else 以便在用户按下按钮完成工作时使用适当的功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2010-10-19
      • 2018-07-02
      • 1970-01-01
      • 2021-02-21
      相关资源
      最近更新 更多