2011-01-13 3 views
1

Um meine EF4 EntityCollection zu bekommen mit Kontrollkästchen Werte zu binden, muss ich manuell die Kontrollkästchen in einer Schleife erstellen wie folgt:Schnell MVC2 Checkbox Frage

<p> 
    <%: Html.Label("Platforms") %><br /> 
    <% for(var i = 0; i < Model.AllPlatforms.Count; ++i) 
     { %> 
      <%: Model.AllPlatforms[i].Platform.Name %> <input type="checkbox" name="PlatformIDs" value="<%: Model.AllPlatforms[i].Platform.PlatformID %>" /><br /> 
    <% } %> 
</p> 

Es funktioniert, aber es funktioniert nicht Wenn ich ein Modellobjekt bearbeite, wird die Gruppe der Kontrollkästchen automatisch mit vorhandenen Werten gefüllt. Kann ich es mit so etwas täuschen?

<p> 
    <%: Html.Label("Platforms") %><br /> 
    <% for(var i = 0; i < Model.AllPlatforms.Count; ++i) 
     { %> 
      <%: Model.AllPlatforms[i].Platform.Name %> <input type="checkbox" name="PlatformIDs" value="<%: Model.AllPlatforms[i].Platform.PlatformID %>" checked=<%: Model.GameData.Platforms.Any(p => PlatformID == i) ? "true" : "false" %> /><br /> 
    <% } %> 
</p> 

Ich stelle dar, da etwas in diese Richtung sein muss, die arbeiten, und ich frage mich nur, wenn ich auf dem richtigen Weg bin.

EDIT: Ich bin absichtlich weg von MVC Check-Box-HTML-Helfer-Methoden, wie sie für meine Bedürfnisse zu unflexibel sind. Meine Kontrollkästchen verwenden Ganzzahlen als ihre Werte von Entwurf.

Antwort

2

Schließen zu ändern. Sie möchten Ihren serverseitigen Code tatsächlich so ändern, dass das Attribut "checked" überhaupt nicht ausgegeben wird , es sei denn, soll das Kontrollkästchen aktiviert sein.

checked="true" 

oder

checked="false" 

sind technisch sowohl ungültige HTML. Source.

Wenn Sie ein getestetes Checkbox wollen, möchten Sie auszusenden:

checked="checked" 

Jeder Wert in Anführungszeichen wird die Box tatsächlich überprüfen (einschließlich geprüft = "false"), aber checked = "checked" betrachtet wird richtig. Also aktualisieren Sie Ihren Code, nur den ternären Operator zwicken, um checked = 'checked' oder gar nichts zu verwenden.

<%: Model.AllPlatforms[i].Platform.Name %> <input type="checkbox" name="PlatformIDs" value="<%: Model.AllPlatforms[i].Platform.PlatformID %>" <%: Model.GameData.Platforms.Any(p => p.PlatformID == i) ? "checked='checked'" : "" %> /><br /> 
+0

Kein Würfel, einen Compilerfehler bekommen. –

+0

Was ist der Fehler? Möglicherweise nur ein Tippfehler. – Sapph

+0

Denken Sie, ich habe es. Aktualisierung meiner Post in einer Sekunde Sie wollen wahrscheinlich "p => p.PlatformId == i" statt nur "p => PlatformId == i". :) – Sapph

0

Sie sind auf dem richtigen Weg, aber ich glaube, Sie brauchen die snipet, um es zu

<%: Model.GameData.Platforms.Any(p => PlatformID == i) ? "checked='true'" : string.Empty %>