2017-08-30 1 views
-1

J'essaie d'avoir un ListBox où l'on peut sélectionner plusieurs balises pour un devis qui est créé dans le formulaire. Tout est rendu bien, toutes les options qui doivent être montrées sont montrées dans le ListBox, mais même si j'en ai sélectionné, la Collection correspondante dans le ViewModel retourné est vide ou nulle.ASP.NET MVC5 Razor ListBox en forme avec MultiSelectList

J'ai simplifié le modèle pour le bien de ma question et il a fondamentalement seulement des citations avec une relation many-to-many aux étiquettes. Donc, quand je veux créer un nouveau devis, je dois lui donner du contenu et une collection de tags.

J'ai donc un modèle comme celui-ci:

public class Quote 
    { 
     public int Id { get; private set; } 

     [Required] 
     public string Content { get; set; } 

     public ICollection<Tag> Tags { get; private set; } 
    } 

et

public class Tag 
    { 
     public int Id { get; set; } 

     [Required] 
     public string Designation { get; set; } 

     public ICollection<Quote> Quotes { get; private set; } 
    } 

ViewModel:

public class QuoteCreateViewModel 
{ 
    public IEnumerable<Tag> Tags { get; set; } 

    public Quote Quote { get; set; } 

    public QuoteCreateViewModel(Quote quote, IList<Tag> tags) 
    { 
     Quote = quote; 
     Tags = tags; 
    } 
} 

QuotesController:

public ActionResult Create() 
    { 
     QuoteCreateViewModel viewModel = 
      new QuoteCreateViewModel(new Quote(), _context.Tags.ToList()); 

     return View(viewModel); 
    } 

    [HttpPost] 
    public ActionResult Create(QuoteCreateViewModel quoteCreateViewModel) 
    { 
     Quote quote = quoteCreateViewModel.Quote; 

     _context.Quotes.Add(quote); 
     _context.SaveChanges(); 

     return RedirectToAction("Index"); 

et la vue correspondante:

@model CiteMe.ViewModels.QuoteCreateViewModel 

@using (Html.BeginForm("Create", "Quotes")) 
{ 
    <div class="form-group"> 
     @Html.LabelFor(m => m.Quote.Content) 
     @Html.TextBoxFor(m => m.Quote.Content, new { @class = "form-control"}) 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(m => m.Quote.Tags) 
     @Html.ListBoxFor(m => m.Quote.Tags, new MultiSelectList(Model.Tags, "Id", "Designation"), new { @class = "form-control", multiple = "multiple" }) 
    </div> 

    <button type="submit" class="btn btn-primary">Save</button> 
} 

En ce qui me concerne @Html.ListBoxFor(m => m.Quote.Tags, new MultiSelectList(Model.Tags, "Id", "Designation"), new { @class = "form-control", multiple = "multiple" }) devrait faire l'affaire pour moi. J'ai aussi essayé une approche que j'ai trouvée here, mais elle donne les mêmes résultats. Collections vides même si quelque chose a été sélectionné ou null au lieu d'une instance de la collection.

Répondre

-1

J'ai trouvé mon erreur dans la mise en œuvre de ce Solution.

Le type de la collection doit être le type de la propriété id que j'ai foiré. Dans le ViewModel, j'avais une propriété de type List<Tag> au lieu de List<typeOf(Tag.Id)>.