2 Stimmen

MVC benutzerdefinierte ViewModel-Probleme

Ich bin ein bisschen ein MVC-Neuling, also müssen Sie mir verzeihen, was ich mir vorstelle, ist eine elementare Frage.

Ich habe ein benutzerdefiniertes Viewmodel erstellt, um eine Multiselect-Liste in meinem Formular zu haben:

public class CustomerFormViewModel
{
    public Customer Customer { get; private set; }
    public MultiSelectList CustomerType { get; private set; }

    public CustomerFormViewModel(Customer customer)
    {
        Customer = customer
        // das gibt eine MultiSelectList zurück:
        CustomerType = CustomerOptions.Get_CustomerTypes(null);
    }
}

Ich habe festgestellt, dass mein erster Versuch nur den ersten Wert des Multiselect erfasst hat, und ich vermute, dass dies daran liegt, dass meine Erstellaktionen so aussahen:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(Customer customer) { ... }

Also habe ich mich entschieden, es wie folgt zu ändern:

    // GET: /Buyer/Create
    public ActionResult Create() { ... }

    // POST: /Buyer/Create
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(CustomerFormViewModel model) { ... }

Damit ich die volle Ausgabe der MultiSelectList erhalten und entsprechend analysieren kann. Das Problem ist, dass sich beschwert wird, dass es keinen parameterlosen Konstruktor für das Viewmodel gibt (und es gibt keinen) - und ich bin mir nicht sicher, wie ich das richtig beheben soll. Nichts, was ich versucht habe, hat funktioniert, und ich brauche wirklich Hilfe!

Falls es hilft, sieht meine Ansicht so aus:

<%@  Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
...
<% using (Html.BeginForm())
    <%= Html.ListBox("CustomerType", Model.CustomerType)%>
...

1voto

eu-ge-ne Punkte 27673

Hast du schon mal einen benutzerdefinierten ModelBinder ausprobiert? Bin mir nicht sicher, ob ich deinen Code klar verstehe, aber das könnte dein Ausgangspunkt sein:

public class CustomerFormViewModelBinder : DefaultModelBinder
{
    protected virtual object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
    {
        var model = new CustomerFormViewModel(customer)
    }
}

0 Stimmen

Habe ein wenig recherchiert und bin zu dem Schluss gekommen, dass - wie du sagst - ein benutzerdefinierter Modellbinder genau das ist, was ich brauche. Jetzt muss ich nur noch herausfinden, wie man einen schreibt! Danke für deinen Kommentar - ich werde deinen Vorschlag befolgen und sehen, ob ich es zum Laufen bringen kann.

1voto

user101306 Punkte 107

Ich glaube, ich habe es:

public class CustomerModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var form = controllerContext.HttpContext.Request.Form;

        Customer customer = base.BindModel(controllerContext, bindingContext) as Customer;

        if (customer!= null)
        {
            customer.CustomerType= form["CustomerType"];
        }

        return customer;
    }
}

Zusammen mit einem Eintrag in der global.asax Datei in der Application_Start() Methode:

ModelBinders.Binders.Add(typeof(Customer), new CustomerModelBinder());

der das durch Kommas getrennte Listenfeldauswahlen in das Feld einfügt. z.B. "1,3,4".

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