【问题标题】:Spring bind in freemarker form not detected in the controller在控制器中未检测到 freemarker 形式的 Spring 绑定
【发布时间】:2014-03-27 18:38:53
【问题描述】:

我有一个声明如下的表单:

  <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”作为名称的任何想法?

【问题讨论】:

    标签: java spring spring-mvc freemarker


    【解决方案1】:

    简短回答 - 无法强制 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 ...
    }
    

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 2019-11-11
      • 2019-01-25
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2016-01-08
      • 2020-03-22
      • 1970-01-01
      相关资源
      最近更新 更多