2012-04-17 173 views
0

我有一個表單用作數據庫記錄CRUD的接口。表單中的某些元素是相互依賴的,因此如果一個字段的值爲X,則其他字段應由用戶填寫並填寫。HTML:發佈空白/禁用表單元素的最佳做法

一個簡單的例子可能是這樣的一個個人信息部分:

<select name="relationship-status"> 
    <option value="single">Single</option> 
    <option value="married">Married</option> 
</select> 

<input type="text" name="spouse-first-name" /> 
<input type="text" name="spouse-last-name" /> 

...其中字段如果relationship-status設置爲marriedspouse-first-namespouse-last-name會被要求,將被禁用(或隱藏)除此以外。

我的問題是,在這個例子中,當一個人從結婚變爲單身,並且想要更新他們的數據時,我們也想清除配偶名稱值並將其發送回服務器,使得值在數據庫中清除。當他們更改爲single時,我們可以使用JavaScript來清除它們的字段,但如果我們禁用表單元素以便它們不能編輯它們,那麼當表單提交時它們不會被POST。

我能想到以下解決方案:

  • 我們可以讓他們readonly,而不是disabled,但該方法只適用於某些表單控件(具體而言,它並不適用於其他select元素工作),所以這不是一個選項。

  • 我們可以複製這些字段作爲hidden輸入,將與形式發佈的,而不是由用戶可編輯的,但是這似乎是這樣的黑客。

  • 我們也可以在提交之前啓用禁用的字段,然後再重新禁用它們。這是我現在使用的方法,但我覺得我錯過了一些東西,而且必須有更好的方法。

有什麼我沒有想到的,或者實現兩者的更明智方式:

  1. 沒有允許用戶編輯字段,
  2. 允許該字段的值即使空白,也可以使用表單發佈。
+2

您應該努力在服務器端強制執行數據有效性。這意味着當有人將狀態更改爲「單個」時,配偶名稱應由服務器清除,而不管POST值如何。 – 2012-04-17 19:18:22

+0

同意。客戶端驗證是爲了製作更好的用戶界面。 *服務器端*驗證是爲了執行數據完整性和業務規則。 – David 2012-04-17 19:19:43

+0

謝謝你們,我可能會這樣做是出於其他原因;然而,它並沒有真正回答我提出的問題。還有其他的場景,服務器驗證根本沒有幫助。 – FtDRbwLXw6 2012-04-17 19:36:42

回答

0

我發現最穩健和最不靈活的解決方案是對<select>以外的所有元素使用readonly屬性。對於<select>元素,我只是禁用<option>子元素,目前未選中。這有效地防止了用戶改變值。然後,我將<select>的顏色變爲灰色背景以禁用,以完成錯覺。在這一點上,所有的表單元素都將隨表單一起發佈,即使沒有值,也不管它們是否「禁用」。

0

我的建議是,除了在客戶端進行驗證之外,在javascript中添加函數form.submit(),如果有人禁用了JS,將無法提交表單,除了同意與其他評論一起,添加服務器驗證。