2 Stimmen

Auswahl eines Kontrollkästchens an eine Aktion weitergeben

Ich habe eine Reihe von Kontrollkästchen, die für den Benutzer verwendet werden, um anzugeben, welche Spalten sie auf einem Raster sehen möchten:

columnselector

Im Moment hat jedes Kontrollkästchen einen eigenen Schlüssel (der im Wesentlichen der Name des Labels ist) und wird in meiner Ansicht wie folgt deklariert:

@Html.CheckBox(column.Key,
               (Request.Form[column.Key] == null ? true : 
                Request.Form[column.Key].Contains("true")),
               new { @class = "columnSelector" })

@Html.Label(column.HeaderText)

Das Problem ist, dass ich die Werte aus der Formularsammlung in meiner Aktion abrufen muss, da ich sonst eine bool für jedes Kontrollkästchen des Spaltenselektors. Alternativ dachte ich, ich könnte sie alle "columnselection" oder etwas nennen und dann würde es an meine Aktion als ein Array von Werten übergeben werden, aber dann verliere ich den Kontext des Wertes, da ich nicht die Spalte Schlüssel haben.

Ich möchte kein Viewmodel mit einer Eigenschaft für jedes Kontrollkästchen erstellen, da diese Funktion auf anderen Bildschirmen mit verschiedenen Spalten verwendet wird und ich sie allgemein halten möchte.

Haben Sie eine Idee, wie ich diese Spaltenauswahl sauber und einfach erreichen kann?

1voto

Scott Rippey Punkte 15184

En Html.CheckBox Methode hat eine seltsame Implementierung. Kontrollkästchen haben eine eindeutige name und im Wesentlichen ein true/false Wert. Dies ist so, dass der Wert leicht auf eine bool Parameter in einer Aktion.

Wie Sie offensichtlich bemerkt haben, ist dies eine schwierige Situation, wenn Ihre Kontrollkästchen dynamisch sind.

Die Lösung besteht darin, eigene Kontrollkästchen zu erstellen, die alle ein gemeinsames name und mit einzigartigen value s. Diese werden sich sehr gut in Ihre Action!

Siehe auch diese Frage, die einige gute Beispiele und Erklärungen enthält .

Hier ist die gewünschte Aktion:

public ActionResult SetSelectedColumns(string[] selectedColumns) {
    // selectedColumns will contain the keys of all the checked columns.
}

Und hier erfahren Sie, wie Sie Ihr HTML korrekt zuordnen können:

<input type="checkbox" name="selectedColumns" value="@column.Key" @(column.Selected ? "checked='checked'" : "") />

Ich empfehle dringend, diese Funktionalität in eine Erweiterungsmethode zu integrieren, so dass Sie auch die ModelState y htmlAttributes . Hier ist mein ungetesteter Versuch:

    public static HtmlString CheckBoxAlt(this HtmlHelper html, string name, string value, bool selected, object htmlAttributes)
    {
        var tag = new TagBuilder("input");
        if (htmlAttributes != null)
            tag.MergeAttributes(new RouteValueDictionary(htmlAttributes));
        tag.MergeAttribute("type", "checkbox");
        tag.MergeAttribute("name", name);
        tag.MergeAttribute("value", value);
        // Determine if this check should be selected:
        var state = html.ViewData.ModelState[name];
        if (state != null)
        {
            var values = (string[])state.Value.ConvertTo(typeof(string[]));
            selected = Array.IndexOf(values, value) != -1;
        }
        if (selected)
            tag.MergeAttribute("checked", "checked");

        return new HtmlString(tag.ToString(TagRenderMode.SelfClosing));
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X