2014-01-05 48 views
31

我的ViewModel具有可選和可選屬性。兩者都是布爾型的。我希望我的視圖有一個複選框,當selectable爲true時啓用,當selectable爲false時複選框爲disabled。什麼是適當的剃刀語法來完成這個?ASP.NET MVC中的複選框禁用屬性

我嘗試了下表中的項目列表上的代碼。無論可選值如何,每行都會返回禁用的複選框。

@Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = !item.Selectable }) 
+1

問題:什麼是'item'?我在你的lambda上看到你有'modelItem => item.Selected',但是'item'獨立於模型本身?或者也許你打算說'modelItem => modelItem.Selected'? – EfrainReyes

回答

59

這是不容易有if條件輔助方法來實現這一點,因爲所有的下方標記將呈現一個殘疾人chechbox。

<input type="checkbox" disabled> 
<input type="checkbox" disabled="disabled"> 
<input type="checkbox" disabled="false"> 
<input type="checkbox" disabled="no"> 
<input type="checkbox" disabled="enabled"> 

這應該在剃刀上工作。簡單如果條件和渲染你想要的。

@if(item.Selected) 
{ 
    @Html.CheckBoxFor(modelItem => item.Selected) 
} 
else 
{ 
    @Html.CheckBoxFor(modelItem => item.Selected, new { @disabled = "disabled"}) 
} 

您可能會考慮編寫一個自定義html助手,爲此提供適當的標記。

+1

對於HTML5,我寫'new {@disabled =「」}'作爲'是有效的,W3C在其樣本中使用。 –

0

對不起,我之前的回答是錯誤的。

只要禁用了該屬性,輸入元素就會被禁用。這個值是否爲真,沒關係。在HTML中,您不能將禁用設置爲false。

因此,只有當條件有效時,您才必須設置disabled屬性。

類似:

object attributes = null; 
if (!item.Selectable) 
{ 
    attributes = new { disabled = "disabled"}; 
} 
@Html.CheckBoxFor(modelItem => item.Selected, attributes) 
+0

我嘗試了你的建議。一切都恢復爲禁用狀態。 –

+0

您可能需要@前綴 – erjoalgo

18

這將不起作用,因爲<input disabled="anything" />將導致禁用的控件。當它被禁用時,你只需要有一個@disabled屬性。

嘗試這樣:

@Html.CheckBoxFor(modelItem => item.Selected, item.Selectable ? (object)new {} : (object)new { @disabled = "disabled }) 

請注意,您可能需要轉換爲(object)

+0

這比選定的答案要乾淨得多。你確實需要把它當作對象;在我的情況下,我有這樣的工作:@ Html.EditorFor(p => item.Selected,new {htmlAttributes = item.Selectable?(object)new {}:(object)new {@disabled =「disabled」}}) – Ian

+1

你可能只需要在左側添加新的對象() –