[英]Spring bind in freemarker form not detected in the controller
我有一个声明如下的表格:
<form id="reply-form-frm" novalidate="novalidate" action="/reply/responsive" method="POST">
[@spring.bind "model.form"/]
[@spring.bind "model.form.message" /]
<label for="${spring.status.expression}" class="clearfix" data-error="Please enter a message">
<span class="label-text">Your message</span>
<span class="set-right required-flag">Required</span>
</label>
<p class="input-error[#if spring.status.errorMessages?size > 0] reveal-error[#else] hide-error[/#if]">
[#if spring.status.errorMessages?size > 0]
<span>[#list spring.status.errorMessages as error]${error}[/#list]</span>
[/#if]
</p>
[@spring.formTextarea "model.form.message", 'aria-required="true" required="required" data-clear="true"' /]
</form>
其他一些字段也以相同的方式呈现。 表单收到的模型是:
model: {
form: {
senderName: "hahahahaha",
senderEmail: "asd@asd.es",
advertId: 1000011793,
optInMarketing: false,
advertClickSource: "natural"
}
我的控制器具有以下映射方法:
public ModelAndView sendReplyResponsive(@ModelAttribute("model.form") ReplyForm replyForm,
BindingResult bindingResult) {
//TODO: content irrelevant ...
}
问题是,当表单呈现时,元素映射到“ form.message”而不是“ model.form.message”,并且我的控制器在发布时找不到ReplyForm对象。
关于如何强制Spring使用“ model.form.message”作为名称的任何想法?
简短的回答-不可能强迫spring使用“ model.form.message”作为名称。
长答案:Spring总是剥离名称的第一部分(在您的情况下为“模型”),它不依赖于表示引擎,该逻辑在org.springframework.web.servlet.support.BindStatus#BindStatus
内部进行编码。 通用方法是使用相同的模型进行渲染和绑定,在这种情况下,您应该:
1.使用“模型”类进行绑定:
public ModelAndView sendReplyResponsive(@ModelAttribute("model") ReplyModel model, BindingResult bindingResult) {
ReplyForm replyForm = model.getForm();
//TODO: content irrelevant ...
}
或2.将ReplyForm公开为独立的模型属性:
<form id="reply-form-frm" novalidate="novalidate" action="/reply/responsive" method="POST">
[@spring.bind "form.message" /]
<label for="${spring.status.expression}" class="clearfix" data-error="Please enter a message">
<span class="label-text">Your message</span>
<span class="set-right required-flag">Required</span>
</label>
<p class="input-error[#if spring.status.errorMessages?size > 0] reveal-error[#else] hide-error[/#if]">
[#if spring.status.errorMessages?size > 0]
<span>[#list spring.status.errorMessages as error]${error}[/#list]</span>
[/#if]
</p>
[@spring.formTextarea "form.message", 'aria-required="true" required="required" data-clear="true"' /]
</form>
模型将如下所示:
model: {
form: {
senderName: "hahahahaha",
senderEmail: "asd@asd.es",
advertId: 1000011793,
optInMarketing: false,
advertClickSource: "natural"
}
},
form: {
senderName: "hahahahaha",
senderEmail: "asd@asd.es",
advertId: 1000011793,
optInMarketing: false,
advertClickSource: "natural"
}
如果您的“模型”仅包含表单,则没有理由保留它。 控制器方法将是:
public ModelAndView sendReplyResponsive(@ModelAttribute("form") ReplyForm replyForm,
BindingResult bindingResult) {
//TODO: content irrelevant ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.