2014-03-27 63 views
1

没有检测到我有一个表格声明如下:春绑定在控制器

<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: "[email protected]", 
    advertId: 1000011793, 
    optInMarketing: false, 
    advertClickSource: "natural" 
} 

我的控制器具有这种映射方法:

public ModelAndView sendReplyResponsive(@ModelAttribute("model.form") ReplyForm replyForm, 
              BindingResult bindingResult) { 
    //TODO: content irrelevant ... 
} 

的问题是,当形式呈现,该元素映射,而不是为“form.message”“ model.form.message“,我的控制器在post上找不到ReplyForm对象。

关于如何强制Spring使用“model.form.message”作为名称的任何想法?

回答

1

简答 - 没有可能强迫spring使用“model.form.message”作为名称。

长答案: 春天总是剥去名称的第一部分(在您的情况“模型”)它不依赖于演示引擎此逻辑编码在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: "[email protected]", 
    advertId: 1000011793, 
    optInMarketing: false, 
    advertClickSource: "natural" 
    } 
}, 
form: { 
    senderName: "hahahahaha", 
    senderEmail: "[email protected]", 
    advertId: 1000011793, 
    optInMarketing: false, 
    advertClickSource: "natural" 
} 

如果你的“模式”只包含形成那就没有理由继续使用它。 并且控制器方法将是:

public ModelAndView sendReplyResponsive(@ModelAttribute("form") ReplyForm replyForm, 
              BindingResult bindingResult) { 
    //TODO: content irrelevant ... 
}