2013-09-05 9 views
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

양식을 처음 제출할 때 모든 변수를 숨김 필드와 제출 단추가있는 새 양식에 저장합니다. –

+2

왜이 세션에서 세션 범위를 사용하는 것을 주저합니까? –

+1

현대적인 브라우저를 사용하면 예기치 않게 세션 변수가 변경 될 수 있습니다. 우리는이 작업을 통해 불에 타 버렸고 이제는 이전보다 훨씬 적은 정보를 세션 범위에 저장합니다. –

답변

1

댄 말했듯이 - 숨겨진 필드에 제출 된 값을 저장합니다.

이전 HTML 페이지에서 볼 수있는 한 가지 문제점은 이전/다음 페이지는 단지 링크 일 뿐이며 버튼을 제출하지 않는다는 것입니다. 따라서 링크를 클릭 할 때 사용자가 다른 URL로 이동하는 것만이 아니라 양식을 제출해야합니다.

+0

사용자는 finish라고하는 제출 버튼을 받게됩니다. 다른 URL로 이동하기 위해 이전/다음 버튼을 사용하고 있습니다. –

5

양식을 여러 섹션으로 나누어 한 페이지에 모두 넣을 수 있습니다. 양식의 '페이지'를 기반으로 JavaScript를 사용하여 양식의 일부를 숨기거나 표시 할 수 있습니다.

전체 양식으로 작업을 완료하고 입력 한 값이 그대로있을 때까지 제출되지 않기 때문에 양식에서 앞으로 또는 뒤로 이동합니다. jQuery 또는 다른 JavaScript로 처리하기가 매우 쉽습니다. 라이브러리.

1

다음은 숨겨진 필드에 모든 양식 변수를 포함시키는 코드 스 니펫입니다. 이 코드 을 제출 하시려는 페이지의 양식 처리기 안에 넣으십시오. 루카스의 대답도 참고하십시오. 귀하의 양식은 잘못 형성 되었기 때문에 ... 제출하지 않아도됩니다.

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

가 다시 ..이 이후의 페이지에있는 양식의 _inside "을 갈 것입니다. 이것은 다중 양식 (여러 단계와 쇼핑 카트, 프로필 항목 등)에서 매우 일반적이다.

1

곰 염두에 위의 방법을 사용하면 서버 측에서 양식 값을 제출할 때마다 (또는 최종 처리 전까지) 양식 값을 다시 확인해야합니다.

서버 메모리를 보완하는 경우 규모에 따라 트래픽 및로드 시간 측면에서 손실되므로 조심스럽게 진행하는 것이 좋습니다. arily는 재정적 영향을 초래할 수 있으며 서버 메모리는 늘어난 트래픽 증가보다 저렴할 수 있습니다. 하루가 끝날 때 요구 사항과 규모에 따라 달라집니다.

주위의 서식 변수를 전달하면 양식 데이터가 악의적으로 노출되는 공격 영역이 증가하므로 세션 변수가 변경되는 것에 대해 우려 할 수도 있지만 (자세한 내용은 궁금 할 것입니다.), 사용자는 이미 배송을 통해 자신을 개방하고 있습니다 이 데이터는 일반 텍스트로 처리됩니다. 이 (또는) 데이터에 대한 클라이언트 측 유효성 검사에 의존하지 마십시오.

관련 문제