0

我有一个带有分页的表单页面。当用户使用分页转到上一页或下一页时,我想保留表单值。我知道可以使用会话范围来完成。但是,在这里我不想使用会话范围。有没有人对如何在不使用会话的情况下做到这一点有任何想法?请告诉我。

这是我的表单页面:

<cfoutput>          
    <form action="#buildUrl(action='survey.save_surveyresults',querystring='surveyId=#rc.surveyid#')#"  method="post">
        <input type="hidden" name="id" value="0">
        <input type="hidden" name="surveyid" value="#rc.surveyId#">
             <div class="container-fluid">
                <div class="row">

                <div class="control-group">
                     <label class="label-control" for="name">Name</label>
                     <div class="controls">
                          <input type="text" name="name" id="name" required="true" placeholder="enter your name" value="#rc.name#">
                     </div>
                </div>

                <div class="control-group">
                     <label class="label-control" for="email">Email</label>
                     <div class="controls">
                          <input type="text" name="email" id="email" required="true" placeholder="enter your Email" value="#rc.email#">
                     </div>
                </div>

                           <cfloop query="rc.questions" startrow="#startrow#" maxrows="#perpage#">

                                  <!--- because we have all questions and answers in query we can use switch instead calling template or view
                                    for each question, so its simplify directory structures, questions directory is not necessary now --->

                                  <h3>#CurrentRow#<cfif rc.questions.isrequired><strong>*</strong></cfif>. #rc.questions.question#<h3> 
                                    <cfswitch expression="#rc.questions.template#">
                                    <fieldset> 

                                        <cfcase value="textbox">
                                            <input type="text" class="input-xlarge" name="#template#_#questionid#" id="question_#questionid#">
                                        </cfcase>


                                        <cfcase value="multiplechoice">
                                            <cfloop list="#answer#" delimiters="," index="i">
                                            <div class="controls">
                                                <label>
                                                   <input type="radio" name="#template#_#questionid#"  id="question_#questionid#" value="#answerID#" >
                                                   <span class="lbl">#i#</span>
                                                </label>
                                            </div>
                                            </cfloop>
                                        </cfcase>

                                        <cfcase value="multiplechoiceother">
                                            <cfloop list="#answer#" delimiters="," index="i">
                                            <div class="controls">
                                                <label>
                                                   <input type="radio" name="#template#_#questionid#"  id="question_#questionid#" value="#answerID#" >
                                                   <span class="lbl">#i#</span>
                                                </label>
                                            </div>
                                            </cfloop>
                                            <div class="control-group">
                                                   <label class="label-control" for="other">Other</label>
                                                   <div class="controls">
                                                      <input type="text" class="input-xlarge" name="#template#_#questionid#"  id="question_#questionid#">
                                                   </div>
                                             </div>
                                        </cfcase>



                                    </fieldset>     
                                    </cfswitch>         
                             </cfloop> 
                            <p></p><br />
                            <cfif startrow GT 1>
                                  <a href="#buildUrl(action='survey.survey_question',querystring='surveyid=#rc.surveyid#&startrow=#startrow-perpage#')#" class="btn">Previous</a>
                            </cfif>
                            <cfif (startrow + perpage - 1) lt rc.questions.recordcount>
                                  <a href="#buildUrl(action='survey.survey_question',querystring='surveyid=#rc.surveyid#&startrow=#startrow + perpage#')#" class="btn">Next</a>
                            <cfelse>
                                  <button type="submit" name="submit" class="btn btn-success">Finish</button> 
                            </cfif>
                      </div>  
                 </div>
             </div>
     </form> 
</cfoutput>
4

4 回答 4

5

您可以将表格分成不同的部分,并将其全部放在一页中。您可以使用 JavaScript 隐藏/显示表单的某些部分,具体取决于它们是表单的哪个“页面”。

这使得在表单中前进或后退变得轻而易举,因为直到他们完成整个表单并且他们输入的值仍然存在时才会提交......并且很容易使用 jQuery 或其他 JavaScript 库处理。

于 2013-09-05T12:35:05.847 回答
1

请记住,使用上述方法,每次提交表单值时(或至少在最终处理之前),您都需要在服务器端重新验证表单值。

您在服务器内存中弥补的内容可能会在流量和加载时间方面有所损失,具体取决于规模,因此我建议您谨慎行事。不必要地增加生产流量会导致财务影响,而且服务器内存通常比扩展增加的流量支出更便宜;归根结底,这取决于您的要求和规模。

发送表单变量也会增加恶意注入表单数据的攻击面,因此虽然您可能担心会话变量在您身上被更改(很想听到更多关于此的信息),但您已经通过发送这些数据来打开自己的纯文本。不要依赖客户端验证此(或任何)数据。

于 2013-09-05T23:48:49.680 回答
1

这是一个简单的代码片段,它将所有表单变量嵌入到隐藏字段中。您可以将此代码放在要提交到的页面上的表单处理程序中。请注意卢卡斯的回答。您的表单可能由于格式不正确的原因而无法正确提交……呃……表单。

<Cfloop collection="#form#" item="fItem">
<cfoutput>
<input type="hidden" name="#fItem#" value="#form[fItem]#"/>
</cfoutput>
</cfloop>

再次......这将在后续页面上的表单的“_inside”。这在多部分表单中相当常见(具有多个步骤的购物车,配置文件条目等)。

于 2013-09-05T13:38:00.610 回答
1

正如丹所说 - 将提交的值保存在隐藏字段中。

我在您的 HTML 中看到的一个问题是上一页/下一页只是链接,而不是提交按钮。因此,请确保在单击这些链接时,用户正在提交表单 - 而不仅仅是转到不同的 url。

于 2013-09-05T12:23:07.980 回答