2014-01-05 22 views
31

Mein ViewModel hat eine Eigenschaft ausgewählt und wählbar. Beide sind boolesch. Ich möchte, dass meine Ansicht eine Checkbox hat, die aktiviert ist, wenn wählbar wahr ist und deaktiviert, wenn wählbar falsch ist. Was ist die richtige Rasierersyntax, um dies zu erreichen?Kontrollkästchen deaktiviert Attribut in ASP.NET MVC

Ich habe den folgenden Code auf einer Liste von Elementen in einer Tabelle ausprobiert. Jede Zeile kommt mit einem deaktivierten Kontrollkästchen zurück, unabhängig vom auswählbaren Wert.

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

Frage zu werfen: Was ist 'item'? Ich sehe auf deinem Lambda, dass du 'modelItem => item.Selected' hast, aber ist' item' unabhängig vom Modell selbst? Oder wollten Sie vielleicht sagen: modelItem => modelItem.Selected'? – EfrainReyes

Antwort

59

Es ist nicht einfach, dies mit einem if Zustand innerhalb der Hilfsmethode zu erreichen, da alle unter Markups ein behindertes chechbox machen werden.

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

Dies sollte im Rasierer funktionieren. Einfach Wenn Bedingung und Rendering was Sie wollen.

Sie können in Erwägung ziehen, einen benutzerdefinierten HTML-Helfer zu schreiben, der dafür das richtige Markup erstellt.

+1

Für HTML5 schreibe ich 'new {@disabled =" "}' als '' ist gültig und wird von W3C in ihren Beispielen verwendet. –

0

Entschuldigung, meine vorherige Antwort war falsch.

Das Eingabeelement wird deaktiviert, sobald das Attribut deaktiviert wird. Es spielt keine Rolle, ob der Wert wahr oder falsch ist. In HTML können Sie deaktiviert nicht auf false setzen.

Sie müssen also das deaktivierte Attribut nur setzen, wenn die Bedingung gültig ist.

so etwas wie:

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

Ich habe deine Empfehlung ausprobiert. Alles kommt als behindert zurück. –

+0

Sie brauchen wahrscheinlich @ Präfixe – erjoalgo

18

Dies funktioniert nicht, da <input disabled="anything" /> zu einem deaktivierten Steuerelement führt. Sie müssen nur eine @ disabled-Eigenschaft haben, wenn sie deaktiviert werden soll.

versuchen, etwas wie folgt aus:

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

Beachten Sie, dass Sie benötigen, um (object)

+0

Dies ist eine viel sauberere Option als die ausgewählte Antwort. Sie müssen als Objekt umwandeln. in meinem Fall hatte ich das funktioniert: @ Html.EditorFor (p => item.Selected, neue {htmlAttributes = item.Selectable? (Objekt) new {}: (Objekt) new {@disabled = "deaktiviert"}}) – Ian

+1

Sie könnten nur in der Lage sein, ein neues Objekt() auf der linken Seite zu gehen –

Verwandte Themen