2011-05-30 11 views
11

मेरी नियंत्रक में:मैं स्प्रिंग एमवीसी फॉर्म में चयनित मान कैसे सेट करूं: नियंत्रक से चुनें?

@Controller 
public class UserController { 

    @RequestMapping(value="/admin/user/id/{id}/update", method=RequestMethod.GET) 
    public ModelAndView updateUserHandler(@ModelAttribute("userForm") UserForm userForm, @PathVariable String id) { 

     Map<String, Object> model = new HashMap<String, Object>(); 
     userForm.setCompanyName("The Selected Company"); 
     model.put("userForm", userForm); 

     List<String> companyNames = new ArrayList<String>(); 
     companyNames.add("First Company Name"); 
     companyNames.add("The Selected Company"); 
     companyNames.add("Last Company Name"); 

     model.put("companyNames", companyNames); 

     Map<String, Map<String, Object>> modelForView = new HashMap<String, Map<String, Object>>(); 
     modelForView.put("vars", model); 

     return new ModelAndView("/admin/user/update", modelForView); 
    } 
} 

चयन फॉर्म फील्ड मेरे विचार में:

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm"> 
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="id" itemLabel="companyName" /> 
</form:form> 

यह मेरी समझ है कि प्रपत्र समर्थन सेम रूप में modelAttribute विशेषता के आधार पर मैप किया जाता था। मैं स्पष्ट रूप से यहाँ कुछ याद कर रहा हूँ।

+0

यह मुद्दा दिखाई देता है मेरी सेटअप से संबंधित नहीं था।समस्या यह थी कि आइटम वैल्यू को कंपनी आईडी संपत्ति पर सेट किया गया था, जबकि तुलना मेरे कंपनी के बैकिंग बीन पर कंपनी के नाम की संपत्ति के साथ की जा रही थी। तो दोनों बराबर नहीं थे, और इसलिए, कोई आइटम चयनित करने के लिए सेट नहीं किया गया था। –

उत्तर

11

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

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

<form:form method="post" action="/admin/user/update.html" modelAttribute="userForm"> 
<form:select path="companyName" id="companyName" items="${vars.companyNames}" itemValue="companyName" itemLabel="companyName" /> 
</form:form> 
+1

ध्यान दें कि जिस लेखक की "तुलना" लेखक लिख रही है वह फॉर्म बैकिंग बीन पर "बराबर" विधि है। –

3

यह इतना जटिल नहीं है। आपको 2 सेम की आवश्यकता है: एक फॉर्म बैकिंग बीन और आपके डोमेन मॉडल में एक चुनिंदा मॉडल।

/* in controller: my select model is a list of strings. However, it can be more complicated, then you had to use PropertyEditors for String <-> Bean conversions */ 

    List<String> mySelectValues = new ArrayList<String>(); 
    mySelectValues.add("M"); 
    mySelectValues.add("F"); 
    modelMap.addAttribute("mySelectValues", mySelectValues); 

आपका फ़ॉर्म, मूल रूप से है:

<form:form command="user"> 
    <form:select path="gender"> 
    <form:options items="${mySelectValues}"></form:options>                          
    </form:select>  
</form:form> 

und यहां मेरे समर्थन वस्तु है:

public class User { 
    private String gender; 
    /* accessors */ 
} 

यहाँ मेरी मॉडल, स्ट्रिंग की एक सूची, के लिए है

वसंत ढांचे "लिंग" क्षेत्र के मूल्य का उपयोग कर automaticaly का चयन करता है।

+0

क्या आप पूर्ण नियंत्रक शामिल कर सकते हैं? इससे मुझे और अंतर्दृष्टि मिल सकती है, क्योंकि मुझे यकीन नहीं है कि मैं अभी तक समझता हूं। साथ ही, फॉर्म टैग पर कमांड विशेषता का उपयोग करना आवश्यक है? मैं वर्तमान में modelAttribute का उपयोग कर रहा हूँ। –

+0

कभी नहीं। कृपया उपरोक्त टिप्पणी देखें। –

+0

यदि मैं 'स्ट्रिंग' के बजाय कस्टम ऑब्जेक्ट के लिए इसे प्राप्त करना चाहता हूं तो क्या करना है? – sarwar026

6

मैं एक ही मुद्दे पर कुछ समय से संघर्ष कर रहा था। यह चुनिंदा क्षेत्र मैं

<form:select path="origin" items="${origins}" itemValue="idOrigin" itemLabel="name" /> 

था के बाद से मैं अपने इकाई के लिए जगह में एक PropertyEditor था मैं

<form:select path="origin.idOrigin" items="${origins}" itemValue="idOrigin" itemLabel="name" /> 

कि ठीक काम किया जैसे कुछ नहीं लिख सकता है, लेकिन PropertyEditor द्वारा पार्स नहीं किया गया है ।

तो, संस्थाओं के बीच समानता का निर्धारण करने के वसंत की जरूरत के बारे में सोच है, मैं बाहर बराबरी और मेरी उत्पत्ति इकाई में hashCode केवल idOrigin संपत्ति का उपयोग कर को लागू करने के लिए आया था, और यह काम किया!

5

इस

<form:select id="selectCategoryId" path="categoryId" 
     class="selectList adminInput admin-align-input" multiple=""> 
     <option value="0">-- Select --</option> 
     <c:forEach items="${categories}" var="category"> 
      <option <c:if test="${category.key eq workflowDTO.categoryId}">selected="selected"</c:if> value="${category.key}">${category.value} </option> 
     </c:forEach> 
</form:select> 
8

सबसे आसान समाधान की तरह कोशिश कर सकते हैं मॉडल कक्षा में toString() विधि ओवरराइड करने के लिए है। तो

@Override 
public String toString() { 
    return this.getCompanyName(); 
} 

वसंत अपने आप फ़ॉर्म में सही मान का चयन करेंगे: इस मामले में बस नीचे की तरह toString() अधिभावी द्वारा वर्ग UserForm बदल विकल्प

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