2009-05-19 6 views
2

Je suis un peu un débutant MVC, donc vous devrez pardonner ce que j'imagine est une question élémentaire.MVC personnalisé viewmodel problèmes

J'ai créé un viewmodel personnalisé afin d'avoir une liste multiselect sous ma forme:

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

    public CustomerFormViewModel(Customer customer) 
    { 
     Customer = customer 
     // this returns a MultiSelectList: 
     CustomerType = CustomerOptions.Get_CustomerTypes(null); 
    } 
} 

je trouve que ma première tentative ne capturé la première valeur du multiselect, et je devinais que ce soit parce que mon créer des actions ressemblait à ceci:

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

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

Alors, j'ai décidé de le changer à ceci:

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

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

Afin que je puisse obtenir la sortie complète de MultiSelectList et l'analyser en conséquence. Le problème est, cela se plaint qu'il n'y a pas de constructeur sans paramètre pour le viewmodel (et il n'y en a pas) - et je ne suis pas sûr de la bonne façon de régler ce problème. Rien de ce que j'ai essayé n'a fonctionné et j'ai vraiment besoin d'aide!

Dans le cas où il aide, moi ressemble à ceci:

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

Répondre

1

Je crois que je l'ai:

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; 
    } 
} 

Avec une entrée dans Application_Start du fichier global.asax() :

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

qui met la séparées par des virgules liste des sélections listbox dans le domaine. par exemple. "1,3,4".

1

Avez-vous essayé une coutume ModelBinder. Je ne sais pas je comprends bien votre code clairement, mais cela pourrait être votre point de départ:

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

J'ai fait quelques recherches et conclu que, comme vous le dites, un classeur personnalisé est exactement ce dont j'ai besoin. Maintenant j'ai juste besoin de comprendre comment en écrire un! Merci pour votre commentaire - Je vais prendre votre suggestion et voir si je peux le faire fonctionner. – user101306