Freemarker:创建下拉字段并从 Map 的键/值中设置其值和选项

Posted

技术标签:

【中文标题】Freemarker:创建下拉字段并从 Map 的键/值中设置其值和选项【英文标题】:Freemarker: Create dropdown field and set its value and option from Map's key/value 【发布时间】:2013-07-18 17:01:11 【问题描述】:

如何在 freemarker 模板中创建下拉字段?下拉选项和值将从地图传递。这是从 Controller 传递的地图:

Map<String, Map<String, String>> codeTable = new HashMap<String,Map<String, String>>();
Map<String, String> codeTableValues = new HashMap<String,String>();
        codeTableValues.put("1", "US");
        codeTableValues.put("2", "UK");
        codeTableValues.put("3", "India");
        codeTableValues.put("4", "Ireland");
        codeTableValues.put("5", "Germany");
        codeTable.put("country", codeTableValues);

对于 freemarker,我遇到了 spring.ftl 并尝试使用 formSingleSelect,但无法理解它。 FTL 代码:

<#elseif field.@type="select">
                <@spring.bind "codeTable.country" />
                <@spring.formSingleSelect "country", codeTable.country, "" />
            </#if>

例外

FreeMarker template error: Method public org.springframework.web.servlet.support.BindStatus org.springframework.web.servlet.support.RequestContext.getBindStatus(java.lang.String) throws java.lang.IllegalStateException threw an exception when invoked on org.springframework.web.servlet.support.RequestContext object "org.springframework.web.servlet.support.RequestContext@1479ef9" with arguments of types [java.lang.String,]. See cause exception. The failing instruction (FTL stack trace): ---------- ==> #assign status = springMacroRequestCo... [in template "spring.ftl" in macro "bind" at line 74, column 17] #else [in template "spring.ftl" in macro "bind" at line 73, column 9] @spring.bind "codeTable.country" [in template "index.ftl" at line 31, column 33] #elseif field.@type = "select" [in template "index.ftl" at line 30, column 25]

【问题讨论】:

如果您想增加获得答案的机会,您应该复制粘贴该错误消息而不会丢失所有换行符。此外,失败的是 @spring.bind(所以也许你的问题可能更具体),但你没有包括原因异常。 感谢您的回复。我知道为什么option 会失败。但是我找不到任何使用 Map 创建下拉字段的示例。你能帮我完成那部分吗? 加上我发现的唯一 spring.formSingleSelect 实现来自这个 SO question。***.com/questions/11433510/… 好吧,我不是 Spring 用户,我只知道 FreeMarker。查看spring.ftl,我发现第二个参数是Map。所以如果你传入的是Map,它应该可以工作。那么现在的错误信息是什么? 周一会试用并通知您。 【参考方案1】:

使用spring.formSingleSelect 构建下拉菜单。假设您有一个名为 Vacccine 的 Bean。

public class Vaccine 

    private Long id;
    
    private String name;
    
    private String companyName;
    
    private Integer country;
    
    // Getter & Setter


国家地图如下...

Map<String, String> countryMap = new HashMap<>();
countryMap.put("1", "US");
countryMap.put("2", "UK");
countryMap.put("3", "India");
countryMap.put("4", "Ireland");
countryMap.put("5", "Germany");

然后你可以像下面这样绑定国家地图...

<@spring.formSingleSelect  'Vaccine.country', countryMap, 'class="form-control" ' />

【讨论】:

以上是关于Freemarker:创建下拉字段并从 Map 的键/值中设置其值和选项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 freemarker 制作下拉列表?

freemarker遍历map,注意 root.put("aa",map)

freemarker判断是不是为空

如何获得可重复的文本字段 liferay7 Freemarker 之一

使用 Freemarker 为发票上的特定项目返回数量 1

下拉框 - 从 Spring MVC 模型/上下文到使用 freemarker 形成