2016-07-13 4 views
1

ich Frühling bin mit 3.0.5 und Tomcat 7Federformen + JSP: Binden Sie den Wert eines <select> auf einer Karte <String, String> - was mache ich falsch

Was ich tue:

Ich habe eine Tabelle von ausgewählten Elementen in JSP erstellt. Jede Select ist mit einem id in meinem Modell verbunden sind, wie folgt aus:

<form:form commandName="someStuff" method="post" id="peopleForm" onSubmit="return validate('${someStuff}');"> 

<%-- A bunch of other unrelated stuff here --%> 
<table> 
    <th>some other info</th> 
    <th>please select a name</th> 
    <c:forEach var="thisThing" items="${allOfTheThings}"> 
     <tr> 
     <td>some other info here</td> 
     <td> 
      <form:select id="name_for_thing_${thisThing.SomeId}" path = "tempNames['${thisThing.SomeId}']" thisThingsId="${thisThing.SomeId}" class="thing_name_selector_class"> 
       <option value="Please Select One">Please Select One</option> 
       <option value="John">John</option> 
       <option value="Joe">Joe</option> 
       <option value="Stephen">Stephen</option> 
       <option value="Mary">Mary</option> 
      </form:select > 
     </td> 
     </tr> 
    </c:forEach> 
</form:form> 

und dann in meiner Domain-Objekt 'someStuff'

definiere ich eine Karte wie:

private Map<String, String> tempNames; 

public Map<String, String> getTempNames() { 
    return tempNames; 
} 

public void setTempNames(Map<String, String> tempNames) { 
    this.tempNames = tempNames; 
} 

Das Problem:

Wenn ich Werte aus dem Dropdown-Menü auswähle und dieses Formular absende, kann ich einen Haltepunkt im Controller setzen und sehen, dass 'tempNames' alle korrekten Werte enthält, die ich verarbeiten und speichern kann - Das ist genau das, was ich erwarten würde - also funktioniert das Binden in einer Richtung ...

Wenn jedoch 'someStuff' bereits Werte enthält, sind diese Werte nicht an die Dropdowns gebunden.

Ich habe versucht

einen 'Wert' Hinzufügen Attribut auf das Element selbst mag:

<form:select id="name_for_thing_${thisThing.SomeId}" path = "tempNames['${thisThing.SomeId}']" value="tempNames['${thisThing.SomeId}']" thisThingsId="${thisThing.SomeId}" class="thing_name_selector_class"> 

und auch wie folgt aus:

<form:select id="name_for_thing_${thisThing.SomeId}" path = "tempNames['${thisThing.SomeId}']" value="${tempNames[thisThing.SomeId]}" thisThingsId="${thisThing.SomeId}" class="thing_name_selector_class"> 

aber das zweite nicht scheinen sogar in der resultierenden HTML ....

Antwort

1

Ich bin auf das gleiche Problem gestoßen. Es scheint, dass Sie option ‚s selected Flagge selbst zu berechnen haben:

<form:select id="name_for_thing_${thisThing.SomeId}" path = "tempNames['${thisThing.SomeId}']" thisThingsId="${thisThing.SomeId}" class="thing_name_selector_class"> 
     <option value="Please Select One">Please Select One</option> 
    <c:choose> 
     <c:when test="${tempNames['${thisThing.SomeId}'] == "John"}"> 
      <option value="John" selected="true">John</option> 
     </c:when> 
     <c:otherwise> 
      <option value="John">John</option> 
     </c:otherwise> 
    </c:choose> 

    ... 
</form:select > 

Bitte beachten Sie, dass <option selected="${tempNames['${thisThing.SomeId}'] == "John"}"> nicht funktionieren. Browser (zumindest Chrome) ignoriert den Inhalt des Attributs selected, das einzige, was zählt, ist die Anwesenheit/Abwesenheit des Attributs selbst: selected="false" macht immer noch die Option ausgewählt.