我一直在处理以下问题:
我有一个简单的模型类叫做User。
public class User{
private Long id;
private String name;
...}
这是我的控制器代码:
@RequestMapping ( value = "/users", params = { "id" } )
public String showEditForm( final Model model, final HttpServletRequest req )
{
User edit = this.userRepository.findOne( Long.valueOf( req.getParameter( "id" ) ) );
model.addAttribute( "user", edit );
return "edit-user";
}
@RequestMapping ( value = "/users", method = RequestMethod.POST, params = {"edit"
})
public String editUser( @Valid @ModelAttribute ( "user" ) final User user,
final BindingResult bindingResult, final Model model )
{
if ( bindingResult.hasErrors() )
{
return "edit-user";
}
return "redirect:/users";
}
以下是显示所有用户的代码片段:
<div class="userlist" th:unless="${#lists.isEmpty(users)}">
<h2 th:text="#{list.user.title}"></h2>
<table>
<thead>
<tr>
<th th:text="#{name}" />
<th th:text="#{details}" />
</tr>
</thead>
<tbody>
<tr th:each="u : ${users}">
<td th:text="${u.name}" />
<td><a th:href="@{/users(id=${tc.id})}" th:text="#{edit}"></a></td>
</tr>
</tbody>
</table>
</div>
最终提交表单:
<form action="#" th:action="@{/users}" th:object="${user}"
method="post">
<fieldset>
<ul th:if="${#fields.hasErrors('*')}" class="errorlist">
<li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li>
</ul>
<div>
<input type="text" th:field="*{id}"/>
</div>
<div>
<label for="name"> <span th:text="#{name}"></span>
</label> <input type="text" th:field="*{name}"
th:class=" ${#fields.hasErrors('name')}? 'fieldError'" />
</div>
<div class="submit">
<button type="submit" th:text="#{update}" name="edit"></button>
</div>
</fieldset>
</form>
现在是问题描述: 只要提交表单中存在“id”字段,一切都正常。但是,如果我从提交表单中删除“id”字段,因为id属性不应该被修改,工作流程就不再起作用了。实际上,在editUser()方法中,id为null。我认为Thymeleaf会将id属性的值设置为null,如果它不在提交表单中。但我不确定这一点。我认为必须有一些解决这个问题的方法,而不是让id属性驻留在提交表单中。
我希望有人能在这里提供帮助。
谢谢。
Edmond