2 Stimmen

asp.net mvc 2 - Modellbindung und Auswahllisten

Ich habe die folgende Auswahlliste:

<select d="Owner_Id" name="Owner.Id">
    <option value="">[Select Owner]</option>
    <option value="1">Owner 1</option>
    <option value="2">Owner 2</option>
    <option value="3">Owner 3</option>
</select>

Es wird gebunden an:

public class Part
{
    // ...other part properties...
    public Owner Owner {get; set;}
}

public class Owner
{
    public int Id {get; set;}
    public string Name {get; set;}
}

Das Problem, auf das ich stoße, ist, dass wenn die [Select Owner] Option ausgewählt ist, dann wird ein Fehler ausgelöst, weil ich eine leere Zeichenfolge zu einem int binden. Das Verhalten, das ich will, ist eine leere Zeichenfolge nur Ergebnisse in eine Null-Eigentümer-Eigenschaft auf Teil.

Gibt es eine Möglichkeit, den Part Model Binder zu ändern, um dieses Verhalten zu erreichen? Also, wenn die Bindung der Owner-Eigenschaft von Part, wenn Owner.Id eine leere Zeichenfolge ist dann nur eine Null Owner zurückgeben. Ich kann das Owner Model Binder nicht ändern, da ich das Standardverhalten in seinem eigenen Controller benötige (Hinzufügen/Entfernen von Besitzern).

1voto

Darin Dimitrov Punkte 990883

Sie könnten es mit einem maßgeschneiderten Modellbinder versuchen:

public class PartBinder : DefaultModelBinder
{
    protected override object GetPropertyValue(ControllerContext controllerContext, ModelBindingContext bindingContext, System.ComponentModel.PropertyDescriptor propertyDescriptor, IModelBinder propertyBinder)
    {
        if (propertyDescriptor.PropertyType == typeof(Owner))
        {
            var idResult = bindingContext.ValueProvider
                .GetValue(bindingContext.ModelName + ".Id");
            if (idResult == null || string.IsNullOrEmpty(idResult.AttemptedValue))
            {
                return null;
            }
        }
        return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
    }
}

Und dann:

[HttpPost]
public ActionResult Index([ModelBinder(typeof(PartBinder))]Part part)
{
    return View();
}

oder sie global registrieren:

ModelBinders.Binders.Add(typeof(Part), new PartBinder());

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