2017-02-14 7 views
8

वापस मार मैं एक वेबसाइट पर निम्नलिखित कार्यप्रवाह है:प्रपत्र व्यवहार "या अद्यतन" जब बटन

  1. कुछ उपयोगकर्ता जॉन डो फार्म के माध्यम से एक कंपनी वाणी 1 (फ़ील्ड: नाम, प्रधान कार्यालय स्थान)
  2. जॉन डो सबमिट करने के बाद (HTTP पोस्ट) फॉर्म 1, कंपनी के बारे में अतिरिक्त कानूनी जानकारी के साथ उसे कंपनी फॉर्म 2 पर रीडायरेक्ट किया गया है (HTTP 302)।

समस्या यह है कि यदि जॉन डो अपने ब्राउज़र के बैक बटन को चरण 2 के दौरान हिट करता है, तो वह ब्राउजर द्वारा भरे गए डेटा के साथ फॉर्म 1 पर उतरेगा (वह पहले से सबमिट किए गए मानों का उपयोग करके - फ़ायरफ़ॉक्स और प्रमुख ब्राउज़र ऐसा करने लगते हैं)।

जॉन डो तब सोच सकता है कि वह कुछ जानकारी अपडेट करने के लिए इस फॉर्म का उपयोग कर सकता है (उदाहरण के लिए कंपनी के नाम पर एक टाइपो को ठीक करें) जबकि वह वास्तव में ऐसा करने वाली एक नई कंपनी बनायेगा, क्योंकि हम सर्वर पर नहीं जानते पक्ष चाहे वह एक नई कंपनी घोषित करना चाहता है या जिसे उसने अभी बनाया है उसे अपडेट करना चाहते हैं।

क्या आप उस समस्या को संभालने के लिए कोई आसान समाधान जानते हैं?

+0

क्या इनपुट मूल्य सर्वर पक्ष से पॉप्युलेट किया जा रहा है? php उदाहरण: '' <इनपुट मूल्य = "" ' संभावित डुप्लिकेट: http://stackoverflow.com/questions/2699284/make-page-to-tell-browser- गैर-कैश-संरक्षित-इनपुट-मान –

+0

क्या अतिरिक्त कानूनी जानकारी 2 वैकल्पिक या आवश्यक बनाने के लिए सबमिट की गई है? – user6003859

+0

@ManuelAzar: आपके द्वारा उल्लिखित प्रश्न पूछता है कि इनपुट में कैश किए गए मानों को प्रदर्शित नहीं करना है, जो कि जाने का एक तरीका है, लेकिन मैं फ़ॉर्म को अपडेट करने के लिए एक स्मार्ट "चाल" ढूंढ रहा था अगर हम जानते हैं कि उपयोगकर्ता बस पिछले डेटा के साथ prefilled निर्माण फार्म वापस आ गया। – Weier

उत्तर

1

मुझे लगता है कि इसे और अधिक उपयोगकर्ता के अनुकूल है जब उपयोगकर्ता पिछले रूप में वापस लौटने और इसे अद्यतन (बजाय वर्णित व्यवहार को रोकने) कर सकते हैं में एक अलग कुंजी (छिपे हुए क्षेत्र) का उपयोग करें । मैं समान तरीके से ज्यादातर मामलों में उपयोग वर्णित समस्या को संभालने के लिए:

  1. मान लेते हैं कि उपयोगकर्ता पेज /some-page, जिसमें बटन "नई कंपनी बनाएं" पर है करते हैं। जब उपयोगकर्ता इस पृष्ठ को खोलता है, तो उसे सर्वर-साइड पर विशेष विधि createOrFindCompanyDraft() निष्पादित किया जाएगा। यह विधि डीबी में केवल नई कंपनी "मसौदा" रिकॉर्ड बनाती है (केवल वर्तमान उपयोगकर्ता के लिए)। उदाहरण के लिए, ड्राफ्ट रिकॉर्ड में प्राथमिक कुंजी id=473 है। जब आप इस विधि को फिर से निष्पादित करते हैं तो यह id=473 ("ड्राफ्ट" स्थिति के साथ) के साथ एक ही रिकॉर्ड लौटाएगा। किसी भी अन्य इंटरफेस पर "ड्राफ्ट" रिकॉर्ड प्रदर्शित नहीं होना चाहिए। और "नई कंपनी बनाएं" लिंक /company/common/473 है।

  2. जब उपयोगकर्ता /company/common/473 पर जाता है, तो आप फॉर्म 1 प्रदर्शित करते हैं, जो "ड्राफ्ट" रिकॉर्ड से भरा जाएगा। पहली बार उपयोगकर्ता खाली फॉर्म देखेंगे। तकनीकी रूप से उपयोगकर्ता मौजूदा रिकॉर्ड अपडेट करेगा, लेकिन आप पृष्ठ पर "नई कंपनी बनाएं" शीर्षक प्रदर्शित कर सकते हैं।

  3. फिर उपयोगकर्ता 2 फॉर्म पर जाएं, उदाहरण के लिए, /company/legal-info/473, आप इस फ़ॉर्म के लिए समान ड्राफ्ट रिकॉर्ड बनाते हैं (चरण 1 के समान)।

  4. जब उपयोगकर्ता फॉर्म 2 सबमिट करते हैं, तो आप रिकॉर्ड id=473 (और किसी भी संबंधित रिकॉर्ड) से "ड्राफ्ट" स्थिति निकाल देंगे।

  5. अगली बार जब उपयोगकर्ता पृष्ठ /some-page खोलता है, तो वर्तमान उपयोगकर्ता के लिए नया ड्राफ्ट रिकॉर्ड बनाया जाएगा।

ब्राउज़र इतिहास में शामिल होंगे:

  • /some-page
  • /company/common/473
  • /company/legal-info/473
  • /some-page2

मैं, इस दृष्टिकोण की तरह है, क्योंकि सभी के लिए एम केवल रिकॉर्ड अपडेट करें। आप कई बार पिछले/अगले रूप में जा सकते हैं (उदाहरण के लिए "बैक"/"फॉरवर्ड" ब्राउज़र बटन)। आप ब्राउज़र बंद कर सकते हैं, और कल पूरा फॉर्म नहीं खोल सकते हैं। इस तरह ब्राउज़र इतिहास के साथ किसी भी अतिरिक्त हेरफेर की आवश्यकता नहीं है।

+0

मुझे समझ में नहीं आता कि आपके उत्तर का पहला अनुच्छेद प्रश्न से संबंधित है (भाग "शो के साथ समाप्त होता है कृपया मुझे इस कैश का उपयोग कैसे करें ")। हालांकि, आपका शेष उत्तर एक संभावित समाधान प्रदान करता है: फॉर्म 1 सबमिट करने से पहले कंपनी प्रविष्टि (और इसकी आईडी) बनाकर और यूआरएल में इसका उपयोग कर। मैंने सोचा कि एक सामान्य सरल समाधान था, लेकिन अन्यथा मैं उस या कुछ संस्करण के साथ जा सकता था। – Weier

+0

@Weier ओह, क्षमा करें। मैं अन्य उत्तर की प्रतिलिपि बनाई गई है। मैंने इसे हटा दिया। – IStranger

3

सभी इनपुट खाली करने के लिए पृष्ठ लोड होने के बाद जावास्क्रिप्ट/jquery स्क्रिप्ट का उपयोग करें। यह "कंपनी को अद्यतन करने" के भ्रम को रोक देगा।

jQuery कुछ इस तरह दिखेगा:

$('#elementID').val(''); 
0

असल में मैं एक चाल के बारे में सोचा प्राप्त करने के लिए यह व्यवहार "पहली पोस्ट, के बाद अद्यतन पर बनाने के" (उपयोगकर्ता सोचता है कि जैसे यह व्यवहार करना चाहिए)।

मान लें कि चरण 1 फॉर्म यूआरएल /create_company/ पर है। तब मैं उस पृष्ठ को एक यादृच्छिक कोड XXX उत्पन्न कर सकता था और /create_company/?token=XXX पर रीडायरेक्ट कर सकता था। जब मैं कंपनी बनाता हूं तो मैं उस जानकारी को सहेजता हूं जिसे इसे पृष्ठ के माध्यम से टोकन XXX के साथ बनाया गया था (उदाहरण के लिए, मैं इसे उपयोगकर्ता के सत्र में सहेजता हूं क्योंकि हमें उस जानकारी को हमेशा के लिए रखने की आवश्यकता नहीं है) और जब फॉर्म सबमिट किया जाता है, तो मुझे पता है कि एक कंपनी पहले से ही इस टोकन का उपयोग कर जेनरेट की गई थी, मुझे पता है कि उपयोगकर्ता ने एक ही फॉर्म इंस्टेंस का इस्तेमाल किया था और बैक बटन का इस्तेमाल किया होगा क्योंकि टोकन अलग होगा अगर उसने स्पष्ट रूप से किसी अन्य कंपनी के लिए पूछा।

आपको क्या लगता है? (मैंने शुरू में सोचा था कि एक आसान समाधान होना चाहिए, क्योंकि ऐसा लगता है कि इस तरह के एक साधारण मुद्दे के लिए थोड़ा अधिक इंजीनियर है)

+0

भी मदद मिलेगी कि कौन सी ढांचा या भाषा है आप उपयोग कर रहे हैं? @Weier –

+0

@ManuelAzar Django – Weier

+0

क्या आप कृपया अपना कंट्रोलर, व्यू और फॉर्म ऑब्जेक्ट पोस्ट कर सकते हैं? इसलिए मैं आपको जो मिला उसके आधार पर आपकी सहायता कर सकता हूं। यह एक मान्य, लेकिन मैला दृष्टिकोण है। @Weier –

0

यह एक यूएक्स प्रश्न की तरह है।

मुझे लगता है कि समाधान उस फ़ॉर्म पर उपयोगकर्ता को दी गई जानकारी के भीतर है, यह समझने में उनकी सहायता के लिए कि वे क्या कर रहे हैं।

एक शीर्षक सेट करें जो 'कंपनी बनाएं' कहता है, उदाहरण के लिए, और 'सबमिट कंपनी' के रूप में अपना सबमिट बटन सेट करने से आपके उपयोगकर्ता को इसके साथ मदद मिलेगी। जब आप कंपनी ऑब्जेक्ट बनाते हैं तो एक अद्वितीय आईडी का उपयोग करें, और एक अद्यतन करने के लिए आईडी को उसी यूआरएल पर वापस पास करें। आपको तब अपना शीर्षक और बटन अपडेट करना चाहिए जो उपयोगकर्ता को बताए कि वे बनाने के बजाय अपडेट कर रहे हैं।

उस अर्थ में मैं कहूंगा कि /company और /company?id=12345 जैसे अधिक सामान्य URL का उपयोग करना बेहतर होगा।

आप अपने सर्वर को CRUD ऑपरेशन की पहचान करने में सहायता के लिए Restful API प्रोटोकॉल का उपयोग करने पर भी विचार कर सकते हैं।http://www.restapitutorial.com/lessons/httpmethods.html

1

आप फॉर्म 2 के लोड पर manipulating the browser history द्वारा स्थिति को भी संभाल सकते हैं, और querystring का उपयोग कर फॉर्म 1 सबमिट करने पर उत्पन्न कंपनी आईडी को पास कर सकते हैं। ताकि आप वास्तव में उपयोगकर्ता को

मान लें कि जॉन फॉर्म 1.html सबमिट करता है, एक अद्वितीय कंपनी आईडी "1001" उत्पन्न होता है और form2.html पर रीडायरेक्ट किया जाता है। अब Form2 के लोड पर आप

var stateObj = { foo: "bar" }; 
history.pushState(stateObj, "page 1", "form1.html?companyid=1001"); 

अभी सेवा का उपयोग, उपयोगकर्ता वापस क्लिक करें जब बटन और Form1 फिर से प्रस्तुत ब्राउज़र इतिहास form1.html? Companyid = 1001 संशोधित कर सकते हैं। आप querystring में कंपनी के लिए जांच सकते हैं और कंपनी को अद्यतन कर सकते हैं।

+0

टीबीएच मुझे नहीं पता था कि हम इतिहास में हेरफेर कर सकते हैं ... लेकिन यह निश्चित रूप से एक साफ समाधान प्रदान करेगा। क्या सभी ब्राउज़र पारदर्शी रूप से अनुमति देते हैं? (मैं leat पर लगता है वे किसी अन्य डोमेन के साथ एक प्रविष्टि जोड़ने की अनुमति नहीं है ...) – Weier

+0

हाँ, यह सबसे अधिक इस्तेमाल किया ब्राउज़र \t द्वारा समर्थित है क्रोम \t एज \t फ़ायरफ़ॉक्स (छिपकली) \t इंटरनेट एक्सप्लोरर \t ओपेरा \t सफारी –

+1

कृपया चेक [ब्राउज़र संगतता] (https://developer.mozilla.org/en-US/docs/Web/API/History_API) –

0

डीजेंगो के "रूटिंग" हिस्से के बिना मदद करना मुश्किल है। मैं सिर्फ express.js-राउटर कार्यक्षमता से अपने अनुभव का उत्तर दे सकता हूं:

  • आप नए उपयोगकर्ताओं के लिए/कंपनी पर एक पोस्ट निर्दिष्ट कर सकते हैं।
  • आप एक बदलते फॉर्म
  • के लिए पोस्ट/कंपनी /: कंपनी आईडी पर पोस्ट के लिए एक और मार्ग निर्दिष्ट कर सकते हैं और निर्माण-पोस्ट से प्रतिक्रिया के रूप में आप विभिन्न स्थान पर रीडायरेक्ट कर सकते हैं।
0

पृष्ठ 1 प्रपत्र डेटा स्टोर करने के लिए इस

<form autocomplete="off" ...></form> 

और एक अन्य

अस्थायी टेबल या सत्र उपयोग का प्रयास करें। यदि पृष्ठ 2 फॉर्म सबमिट किया गया है तो पृष्ठ 1 के अस्थायी डेटा का उपयोग करें जो डेटाबेस या सत्र में संग्रहीत है।

दोनों पेज 1 और पेज 2.

संबंधित मुद्दे