2017-01-16 47 views
1

我對spring mvc世界很新。我試圖從HTML表單複選框發送布爾值。當用戶選中複選框時,它將發送true,否則返回false。Spring MVC - 如何在布爾變量中綁定HTML複選框的值

<form class="attendanceBook" role="form" method="post" action="/attendances"> 
    <div class="row"> 
     <div class="form-group"> 
      <div class="col-xs-4"> 
       <label class="control-label">Check Here</label> 
      </div> 
      <div class="col-xs-4"> 
       <input type="checkbox" name="i" id="i" value="true" /> 
      </div> 
      <div class="col-xs-4"> 
       <input type="submit" value="Click"/> 
      </div> 
     </div> 
    </div> 
</form> 

一些googilng後,我發現this so post,它說standard behaviour is the value is only sent if the checkbox is checked.所以我有什麼理解是,如果複選框選中,那麼形式將與複選框的值提交,否則將無法提交。當未選中複選框時,數據類中的初始化值將生效。

但在我的情況下,我每次提交表格時都會提交true

這裏是我的rest控制器的綁定HTML表單提交。

@RestController 
@RequestMapping("attendances") 
class AttendanceRestController { 

val logger = getLogger(AttendanceRestController::class.java) 

@PostMapping 
fun patchAttendance(@RequestBody attendanceJson: AttendanceJson): ResponseEntity<*> { 
    logger.info("attendanceJson {}", attendanceJson) 

    return responseOK(attendanceJson) 
} 

} 

數據類(我用科特林)

data class AttendanceJson (
    var i: Boolean = false, 
    var t: String = "" 
) 

那麼,什麼將是從表單提交與複選框綁定布爾數據的方法。我也使用Thymeleaf。提前致謝。

回答

2

我在Struts中工作,對Spring不太瞭解。但我面臨類似的情況。

我所做的是我綁定了一個布爾屬性複選框在我的類。因此,對於每個複選框,一個布爾變量。而在前端提交的時候,我會打電話給一個JS功能代碼如下

function verifyCheckboxes() { 

    document.getElementById("researchPaper").value = document.getElementById("researchPaper").checked; 

    document.getElementById("researchPaperSeminarProceed").value = document.getElementById("researchPaperSeminarProceed").checked; 

    document.getElementById("extraActivities").value = document.getElementById("extraActivities").checked; 

    document.getElementById("studentAchivements").value = document.getElementById("studentAchivements").checked; 

} 

在這裏你可以看到我剛剛分配的值之前檢查該複選框財產提交。這將是真或假。

+0

感謝您的回覆。是的,我可以用JS做到這一點。但是,「標準行爲」呢? – seal

+0

我不認爲這會是一個問題,這段代碼適合我。 –

+0

+1爲您的解決方案。這是很好,乾淨。但讓我們看看是否有人可以回答什麼是原因,以及如何才能通過原始HTML做到這一點。 – seal

0

您應該從輸入中刪除'value'屬性。如果您希望在加載頁面時選中複選框,請添加「已檢查」屬性而不是「值」。 這種更換輸入線:

<input type="checkbox" name="i" id="i" checked="checked"/> 

這就是爲什麼你總是在代碼中得到「真實」背後的原因。

+1

不,這不是原因。根據我測試過的代碼。它提交'on'。由於這不是任何布爾值,所以spring不綁定數據,而是保留變量的初始值。如果我不初始化變量,那麼它會拋出一個異常,它說 - 開或關不會綁定,需要true或false。 – seal