如何将c:forEach标记的循环索引附加到struts select / text标记的属性? 例如. %@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC" div class="section g
例如.
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%> <c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC"> <div class="section guest-details"> <html:select property='title_guest<c:out value="${gC.index}"/>'> <html:options collection="titles" property="code" labelProperty="value" /> </html:select> </div> </c:forEach>
抛出以下错误
org.apache.struts.taglib.html.SelectTag.calculateMatchValues(SelectTag.java:246)中的javax.servlet.jsp.JspException
现在,当我在< html:select ...调试代码时,它显示当它设置的属性属性时,它设置为“title_guest< c:out value =”${gC.index}“/>”这可能是上述例外的原因.
另外,我应该提一下,如果我使用上面的格式将循环索引附加到标准的html标记属性,如< select>标签,代码工作正常.
例如
<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC"> <div class="section guest-details"> <select name='title_guest<c:out value="${gC.index }"/>'> <option value="">Select Title</option> </select> </div> </c:forEach>
正确输出预期的HTML
我做错了什么,我应该使用EL来创建将填充html:select标签的“property”属性的字符串吗?
UPDATE
以下片段也尝试了,但也没有用
< html:select property =“title_guest ${gC.index}”>
并且,这也不起作用
<c:set var="guestTitle">title_guest${gC.index}</c:set> <html:select property="${guestTitle}" styleClass="{required: true}"> <html:options collection="titles" property="code" labelProperty="value" /> </html:select>在经历了一些痛苦的挖掘后,我似乎找到了问题并因此找到了解决方案. c:forEach标记不会将varStatus导出为脚本变量,因此varStatus变量不能在RT Expr中用于html:select标记的property属性.
但是,c:forEach确实将varStatus变量导出为pageContext属性,该属性可以被检索并用于提取索引/计数.唯一的问题是你必须导入javax.servlet.jsp.jstl.core.LoopTagStatus类并使用它来手动重新创建varStatus变量,以便它可以在scriplet中使用
这是有效的代码片段
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" import="javax.servlet.jsp.jstl.core.LoopTagStatus" %> ... <c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC"> <% LoopTagStatus gN = (LoopTagStatus)pageContext.getAttribute("gC"); %> <html:select property='<%="title_guest"+gN.getIndex()%>'> <html:options collection="titles" property="code" labelProperty="value" /> </html:select> </c:forEach>
我不认为这是一个干净的解决方案(但可能是唯一的解决方案).因此,在我接受它作为最终答案之前,我会先让社区对这个答案进行投票(或者写一个更好的答案).