Spring模型绑定与禁用输入

10
抱歉问一个愚蠢的问题,但我不太明白发生了什么,如果是我所怀疑的...那我真的很困惑。 我正在使用Spring Boot + Thymeleaf + Materialize CSS来显示和验证表单。 现在我在许多示例中看到的情况是:

有些表单字段是预填充的,并且对客户端应该显示为禁用状态,显示其预填充值。 这种预填充是在控制器中进行的,而我处理其他请求并重定向到此视图

我正在使用th:object将POJO绑定到表单中,如下所示

<form id="register_form" action="#" th:action="@{/showform}" th:object="${userInfo}" method="post">
 <div class="input-field">
   <label th:text="#{label.surname}" for="surname"></label>
   <input type="text" th:field="*{surname}" id="surname" th:attr="value=${userInfo.surname}" />
 </div>
 <div class="input-field">
   <label th:text="#{label.name}" for="givenname"></label>
   <input type="text" th:field="*{givenname}" id="givenname" th:attr="value=${userInfo.givenname}" disabled="disabled" />
 </div></form>

在控制器中的POST处理程序中获取它,就像这样:

@RequestMapping(value = {"/showform"}, method = RequestMethod.POST)
public ModelAndView submitFormPage(@ModelAttribute("userInfo") @Valid UserInfo userInfo, 
      BindingResult bindingResult, RedirectAttributes redir) 
{      
  ModelAndView mview = new ModelAndView();

  if (bindingResult.hasErrors()) 
  {
     // show form again with error messages
     mview.addObject("userInfo", userInfo);
     mview.setViewName("/showform");
  }
  else 
  {
     // ...
  }

  return mview;
}

RedirectAttributes是用于其他目的的。如您所见,表单上有两个元素,第一个启用,第二个禁用。 它们的值通过我通过ModelMap传递给视图的POJO预填充值正确地填充。我也可以在GET处理程序中跟踪它。

但是,从视图返回的ModelMap包含具有空值的POJO,这些空值位于绑定到禁用控件的元素的位置。即使这些控件被禁用,我也希望它们的内容由value属性的内容填充。启用的控件可以正确地携带它们的值。

或者只是因为禁用的控件根本没有包含在回发中?如果是这种情况,你建议我怎么做?一些人建议添加一个模拟禁用控件行为的晦涩CSS。或者我在一般的连接中错过了什么?

我恐惧可能的解决方法 - 但我肯定做错了什么.. th:attr是我尝试的解决方法之一,但似乎并没有起作用。我也尝试使用th:id和th:disabled,但也没有帮助。


2
哎呀,我简直不敢相信我在这上面花了这么多时间... disabled != readonly https://dev59.com/wXE85IYBdhLWcg3wr1ux - hello_earth
1个回答

29
我认为这里存在一个关于disabled使用的误解。

readonly元素只是不可编辑,但在表单提交时发送。而disabled元素不能被编辑且不会在提交时发送。另一个不同之处在于,readonly元素可以聚焦(在表单中“制表”时获取焦点),而disabled元素则不能。

更详细的比较

因此,要回答你的问题:如果您想将属性绑定到pojo并且用户仍然无法编辑它们,则应选择readonly

谢谢,伙计。那很有帮助。 - Adil Aslam Sachwani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接