2012-01-04 2 views
13

मैंने मॉडल एट्रिब्यूट का उपयोग स्प्रिंग वेब एप्लिकेशन में ऑब्जेक्ट को बाध्य करने के लिए किया था।चेकबॉक्स मान झूठी होने पर ऑब्जेक्ट में बाध्य नहीं होते हैं?

एक बार जब मुझे लगता है कि किसी ऑब्जेक्ट में बूलियन मान ए है तो एक सत्य है, तो यदि हम ए के चेकबॉक्स को अनचेक करते हैं तो इसका मान अपडेट नहीं किया जाएगा।

उदाहरण के लिए, मेरे पास एक पाठ वस्तु है जिसमें विशेषता "सक्रिय" = सत्य है। "पाठ संपादित करें" दृश्य में, मैं एक चेकबॉक्स बनाता हूं जो "सक्रिय" में बाध्य होता है। यदि चेकबॉक्स चेक किया गया है तो चीजें अच्छी तरह से काम करती हैं (बाध्यकारी वस्तु परिवर्तन को प्रतिबिंबित करती है), लेकिन अगर हम चेकबॉक्स को अनचेक करते हैं तो ऑब्जेक्ट सबक नहीं बदलेगा।

आगे का अध्ययन मुझे बताता है कि ऐसा इसलिए है क्योंकि चेकबॉक्स मान ब्राउज़र द्वारा सबमिट नहीं किया जा सकता है (यह HTML का एक इन-डिज़ाइन है)। इसलिए मुझे यह निर्धारित करने के लिए बदसूरत request.getParameter का उपयोग करना है या नहीं।

मैं बस this question द्वारा आया हूं, और मुझे लगता है कि एएसपीनेट एमवीसी इसके आसपास और अधिक सुंदर ढंग से काम करने का एक तरीका प्रदान करता है। मुझे लगता है कि वसंत को कुछ समान प्रदान करना होगा। क्या किसी को पता है यह कैसे किया जाता है?

नियंत्रक कोड:

@RequestMapping(value="/test", method = RequestMethod.POST) 
    public String processEditLesson(@Valid Lesson lesson, BindingResult bindingResult, Model model) { 
     System.out.println("Lesson is active: " + lesson.isActive()); // still "true" even if the checkbox is unset 

     // Current work-around 
     String isActive = request.getParameter("active"); 
     if (StringUtils.isNotNullOrEmpty(isActive)) { 
      lesson.setActive(true); 
     } else { 
      lesson.setActive(false); 
     } 
     ... 
    } 

देखें कोड:

<form id="lesson" class="EditorForm" action="${rc.getContextUrl('/test.html')}" method="post" > 

    <fieldset> 
     <legend><@spring.message code="lesson.edit"/></legend> 
     <@spring.formHiddenInput "lesson.id" /> 
     <@spring.formHiddenInput "lesson.studio.id" /> 

     <div class="Entry"> 
      <label for="name"><@spring.message code="lesson.message"/></label> 
      <@spring.formInput "lesson.message" /> 
      <span class="ErrorMessage"><@spring.showErrors "<br/>" /></span> 
     </div> 

     <input type="checkbox" name="active" checked="checked" /> 
     <label for="active">${rc.getMessage('lesson.active')}</label> 

     <input type="submit" value="<@spring.message code='common.update' />" /> 
    </fieldset> 
</form> 

उत्तर

20

स्प्रिंग एक समाधान में बनाया गया है

के बाद मेरी कोड है।

आप प्रपत्र को यह अतिरिक्त छिपा क्षेत्र जोड़ें:

<input type="hidden" value="on" name="_active"/>

एक अग्रणी अंडरस्कोर के साथ पैरामीटर मार्कर के कुछ प्रकार है, एक ही नाम के साथ एक चेकबॉक्स पैरामीटर के अस्तित्व का संकेत है, लेकिन बिना अंडरस्कोर

वसंत अब lesson.active को झूठ में सेट करना चाहिए यदि केवल _active=on सबमिट किया गया हो।

+0

धन्यवाद, आप इस तरह से कैसे जानते हैं? मेरा मतलब है, मैंने कोई परिणाम खोजने के बिना बहुत कुछ खोजा है। बस थोड़ा सा फिक्स: मुझे इसे काम करने के लिए "_activeon.active" के बजाय "_active" का उपयोग करने की आवश्यकता है। –

+1

मैंने नामों को सही किया है। - मुझे यह कैसे पता है? मैं 5 साल से अधिक के लिए पेशेवर तरीके से स्प्रिंग एमवीसी कर रहा हूं। जब मैंने यह सवाल शुरू किया तो यह बहुत लोकप्रिय था। बीटीडब्ल्यू: यदि आप स्प्रिंग चेकबॉक्स जेएसपी टैग का उपयोग करते हैं, तो छुपा दायर पहले से ही शामिल है। – Ralph

+1

उपयोगी जानकारी। हालांकि मुझे लगता है कि तत्व का नाम '.' है, तो मान स्वचालित रूप से नहीं बदलेगा। मुझे लगता है कि मुझे जावास्क्रिप्ट – abiieez

2

मुझे लगता है कि आपको springframework टैग का उपयोग करना चाहिए - आप सादे HTML का उपयोग क्यों कर रहे हैं? आपके विचार JSP पेज है, तो सिर्फ आयात:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

और फिर आप उपयोग कर सकते हैं:

<form:checkbox path="path" label="label" /> 

जो समस्या संभालती है।

+0

जेएसपी विधि के लिए धन्यवाद, लेकिन वास्तव में मैं freemarker का उपयोग करें। फ्रीमार्कर मैक्रो फॉर्म चेकबॉक्स में –

1

आप वसंत फ्रेमवर्क टैग का उपयोग कर सकते हैं जैसे कि यह स्वचालित रूप से आपको बीन कक्षा में चयनित मान सेट करेगा और फिर आपके नियंत्रक वर्ग में इसका मूल्य प्राप्त करना बहुत आसान होगा।

रास्ते पर आप अपने सेम चर नाम

डाल करने के लिए और यह आप अपने फार्म और उपयोग उस नाम को आदेश है कि jsp

मॉडल करने के लिए अपने सेम वस्तु बाध्य करने के लिए आदेश नाम देने के लिए की जरूरत का उपयोग करने की जरूरत है। addAttribute ("कमांड नाम", बीन ऑब्जेक्ट) ऑब्जेक्ट को बाध्य करने के लिए अपने नियंत्रक में इसका उपयोग करें।

+0

के साथ जाने के लिए कोई उदाहरण नहीं है, लेकिन मैं jsp का उपयोग नहीं करता हूं। मैं फ्रीमार्कर का उपयोग करता हूं, और यदि आप इसे फ्रीमार्कर में लिखना चाहते हैं, तो कृपया मुझे बताएं। अभी के लिए, मैंने इसके बजाय अपने कस्टम मैक्रो का इस्तेमाल किया। –

+0

क्षमा करें उस दोस्त के लिए कोई विचार नहीं !!! – Raj

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