Frage

Ich habe ein Modell, dass in etwa so aussieht:

public class SampleModel
{
    public static SampleModel Create()
    {
        return new SampleModel
        {
            Boolean = true,
            // set several more properties...
            Colors = new SelectList(new[] { "Red", "Green", "Blue" }, "Green")
        };
    }

    public bool Boolean { get; set; }
    // define several more properties...
    public SelectList Colors { get; set; }
}

Ich lasse automatisch ASP.NET MVC die Eigenschaften Gerüst mit Html.DisplayForModel() für meine Ansicht Details und Html.EditorForModel() für meine Edit-Ansicht.

Ergebnisse:

  • Die Edit-Ansicht funktioniert super. Colors zeigt sich als ein Menü mit drei Elementen (Rot, Grün und Blau) und Grün standardmäßig aktiviert ist.

  • Für die Details zu sehen, ich aber „False True False“, die für jedes Element des Menüs offenbar eine Liste der IsSelected Wert ist. Die definitiv nicht wollen, ist, ich will. Ich kann es nur Anzeige wie "Green".

  • Ein weiteres Problem ist, dass, wenn ich versuche, UpdateModel(sampleModel) in meinem Controller zu tun, ich den Fehler: „Kein parameterlosen Konstruktor für dieses Objekt definiert.“ Dies liegt vermutlich daran Colors ein SelectList ist, und es gibt keinen parameterlosen Konstruktor für SelectList, so kann es nicht vollständig die Bindung.

Also, ich glaube, ich verstehe, was die Probleme sind, aber ich konnte wirklich eine gute Lösung für dieses Szenario verwenden, die eine Menge zu kommen scheint, wenn Sie Modelle Objekte mit Fremdschlüssel haben.

Einige Fragen:

  1. Wie erhalte ich Colors als Menü für die Edit-Ansicht zu zeigen, sondern als nur einen einfachen String-Wert (zum Beispiel „Green“) in der Detailansicht?
  2. Wie kann ich einen „kein parameterlosen Konstruktor“ Fehler verhindern, wenn ein Modell zu aktualisieren, die eine SelectList enthält?
  3. Wenn mein Modell / Ansichtsmodell enthält tatsächlich einen Fremdschlüssel, ColorId, statt Colors, was die beste Praxis für das Erhalten der Ansicht Details würde den Namen der aktuellen Farbe zu zeigen, und die Edit-Ansicht ein Menü zu zeigen, die alle die Farbnamen in der Color Tabelle meiner Datenbank aufgelistet. Wenn es hilft, ich bin mit LinqToSql (SqlMetal) in meine Modellklassen zu erzeugen.
War es hilfreich?

Lösung

Ihre Probleme ergeben sich alle aus der Tatsache, dass Sie eine Select als Modell Eigenschaft sind auszusetzen. Abhängig von der genauen Situation würde ich tun, wahrscheinlich so etwas wie:

  1. Erstellen Sie 3 separate Modellklassen: eine „Domäne“ Modell, bestehend aus Ihrer LinqToSql Objekte (oder Wrapper um sie herum) und zwei Ansicht Modelle, eines für die Ansicht Details und eine für die Edit-Ansicht.

  2. Die Ansicht Detail Modell sollte die aktuell ausgewählte Farbe Namen enthalten. Die Details der Aktion würde diese Eigenschaft, entweder mit der FK-Beziehung in Ihren Domain-Objekten oder manuell durch die Details für die ausgewählte Farbe nach oben.

  3. Die Ansicht Modell bearbeiten sollte eine Eigenschaft für die ausgewählte Farbe der ID enthalten. Es sollte auch eine Auswahlliste der verfügbaren Farboptionen enthält, mit dem gewählten Wert Satz auf die aktuell ausgewählte ID.

  4. Die Aktion bearbeiten, dass Griffe die Form Post eine Instanz der Edit-Ansicht Modell annehmen sollten und diese Änderungen auf dem Domänenmodell abzubilden. Da die ausgewählte Farbe eine einfache Eigenschaft, sondern als eine Auswahlliste ausgesetzt ist, ist es einfach zu validieren und Karte auf das Business-Objekt zurück.

Wenn Ihre Situation ist sehr einfach könnten Sie in der Lage sein, mit einem einzigen Blick Modell wegzuzukommen sowohl für Anzeigen und Bearbeiten, oder auch das Bestehen des Domain-Objekts direkt in die Detailansicht. Auf jeden Fall, solange Sie die Select aus dem Modell entfernen und die ausgewählte Farbe als eine einfache ID aussetzen, dann sollten Sie in Ordnung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top