如何在不使用会话的情况下保留表单值?

时间:2013-09-05 12:08:03

标签: coldfusion

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

这是我的表单页面:

<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 个答案:

答案 0 :(得分:5)

您可以将表单分成不同的部分,并将其全部放在一个页面中。您可以使用JavaScript根据表单的“页面”隐藏/显示表单的某些部分。

这样可以快速前进或后退,因为在完成整个表单后它们才会被提交,并且它们输入的值仍然存在...并且使用jQuery或其他JavaScript库非常容易处理

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

再次..这将在后续页面上的表单中显示。这在多部分表单(具有多个步骤,个人资料条目等的购物车)中相当常见。

答案 3 :(得分:1)

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

您在服务器内存中弥补了什么,在流量和加载时间方面可能会丢失,具体取决于规模,因此我建议您谨慎行事。不必要地增加生产流量会导致财务影响,并且服务器内存通常比扩展增加的流量支出更便宜;它归结为你的要求和当天结束时的规模。

运输表单变量也会增加您的攻击面,以便恶意注入表单数据,所以当您可能担心会话变量被改变时(很想知道更多关于此信息),您已经通过发送这个来打开自己了数据以纯文本形式出现。不要依赖客户端验证此(或任何)数据。