3 Stimmen

Mvc SelectList bindet nicht, wenn der Schlüssel des Dictionary nullbarer Dezimal ist.

Warum wird meine Dropdown-Liste nicht gebunden? Verwendung der DropDownListFor Razor-Hilfsfunktion.

Sicht:

@Html.DropDownListFor(m => m.ModelObject.VatRate, Model.VatRatesList)

ViewModel:

    public SelectList VatRatesList
    {
        get
        {
            return new SelectList(
                new Dictionary
                {
                    { 0m, string.Empty },
                    { 1.2m, "20%" },
                    { 1m, "0%" }
                }, "Key", "Value",
                ModelObject.VatRate ?? 0m);
        }
    }

Danke.

3voto

Kev Punkte 2636

UPDATE

Bei weiteren Untersuchungen habe ich herausgefunden, dass dies mit der Modell-Eigenschaft zu tun hat, die ich zu binden versuche. Es handelt sich um eine nullable Dezimalzahl. Wenn ich sie in eine Dezimalzahl ändere, wird der korrekte Wert aus der Liste ausgewählt.

Hier beginnen die Dinge jedoch seltsam zu werden. Wenn ich 4 Dezimalstellen für die Schlüssel im Wörterbuch verwende, funktioniert es mit einer nullable Dezimalzahl im Modell. Mit anderen Worten, dies funktioniert:

 public SelectList VatRatesList
    {
        get
        {
            return new SelectList(
                new Dictionary
                {
                    { 0.0000m, string.Empty },
                    { 1.2000m, "20%"},
                    { 1.0000m, "0%"}
                }, "Key", "Value");
        }
    }

Ich habe keine Ahnung warum. Möglicherweise verwendet der HTML-Helper intern ToString(). Ich denke, ToString() würde eine Dezimalzahl in einer 4DP-String-Repräsentation zurückgeben. Ich muss mir den MVC-Quellcode ansehen, um es herauszufinden.

1voto

mattytommo Punkte 54775

Dieser genaue Code funktioniert für mich (ich kann den Rest Ihres Modells/Ihrer Ansicht nicht sehen, daher ist es ziemlich schwierig, das Problem zu ermitteln). Das ist der Code, den ich verwendet habe:

Controller:

 public ActionResult Index()
 {
        var model = new Model();
        model.ModelObject = new ModelObject();

        model.ModelObject.VatRatesList = new SelectList(
            new Dictionary
            {
                { 0m, string.Empty },
                { 1.2m, "20%" },
                { 1m, "0%" }
            }, "Key", "Value",
            model.ModelObject.VatRate ?? 0m);

        return View(model);
 }

Ansicht:

@using (Html.BeginForm())
{
@Html.DropDownListFor(m => m.ModelObject.VatRate, Model.ModelObject.VatRatesList)

}

Controller-Postmethode:

[HttpPost]
public ActionResult Index(Model model)
{
    // Mit einem Haltepunkt in der untenstehenden Zeile kann ich sehen, dass model.ModelObject.VatRate gefüllt ist
    return RedirectToAction("Index");
}

Ich habe diese beiden Klassen verwendet:

public class Model
{
    public ModelObject ModelObject { get; set; }
}

public class ModelObject
{
    public decimal? VatRate { get; set; }
    public SelectList VatRatesList { get; set; }
}

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