一个相当常见的用例发生在有 Java 对象列表的情况下,可以在 Web 表单上从中进行选择 - 通常您会使用对象的主键作为值,以便 Controller 可以执行查找,或者只是将键绑定(bind)到创建/更新的任何对象。
我的问题是要从中选择的列表不是持久的、键控的对象,它们是来自服务的业务模型,无法根据包含的数据来检索它们。下面是一些伪代码,其中给页面提供了 Foo 的列表,我们可以很容易地与 Controller 通信 onSubmit Foo 的名称,但是如果 Foo 的其他字段需要提交呢?
Controller :
referenceData() {
...
List foos = fooService.getFoosForBar( bar )
return { 'foos', foos }
}
jsp:
<form>
...
<spring:bind path="formData.foo">
<select name="<c:out value="${status.expression}" />">
<c:forEach items="${foos}" var="foo">
<option value="<c:out value="${foo.name}"/>">
<c:out value="${foo.name}"/>
</option>
</c:forEach>
</select>
</spring:bind>
...
</form>
一些示例解决方案是使用隐藏字段来提交 Foo 的其他属性,并在选择更改时使它们保持同步,但我不喜欢在这种可能会增加困惑的情况下使用 JavaScript。当然还有其他方法可以做到这一点。
我的问题是是否存在任何标准做法来实现这一点?还是我应该想出自己的方法?如果可能的话,我宁愿不重新发明轮子,这似乎很常见,以至于仅仅依靠它可能不是最好的方法。
最佳答案
根据您的限制,您必须将 foos 的其他数据成员编码为选项的值。
<option label="${foo.name}" value="${foo.encodedValues}"/>
encodedValues
方法可能看起来像这样:
private String SEPARATOR = ",";
public String getEncodedValues()
{
final StringBuffer returnValue = new StringBuffer();
returnValue.append(field1);
returnValue.append(SEPARATOR);
returnValue.append(field2);
returnValue.append(SEPARATOR);
returnValue.append(field3);
return returnValue.toString();
}
如果您有许多选择需要编码值,您可能需要创建一个类来对这些值进行编码和解码以集中代码。
关于java - Spring MVC - 下拉对象选择 - 无主标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155381/