2013-06-10 10 views
6

Ho un problema a ottenere valori di elenco a discesa multi selezione. Chiunque può suggerirmi come ottenere più valori dropdownlist e come ottenerli nel controller.Come ottenere valori Dropdownlist multiselected in asp.net mvc

Il mio codice è simile a questo: -

Modello

public string BusinessUnitSiteSafetyRepresentative { get; set; } 

controller

[HttpPost] 
public ActionResult AddClientBusinessUnitSite(LocalAddClientBusinessUnitSite local) 
{ 
var query = from o in entitydb.systemusersorganizations.toList() 
      from c in entitydb.contacts.toList() 
      where o.orgId == clientId 
      select new SelectListItem 
      { 
       Text = c. Name; 
       Value = c.OrgId.toString()     
      } 
ViewBag.list1 = query.ToList(); 
} 

Beh, posso ottenere se il valore singolo viene selezionato & può salvare a DB .Ma come selezionare più valori e come ottenerli in Contr oller per salvarli.

Nota: - Sto recuperando i valori dell'elenco a discesa dal DB come mostrato sopra.

View

@Html.ListBoxFor(x => Model.BusinessUnitSiteSafetyRepresentative,new 
MultiSelectList((IEnumerable<SelectListItem>)@Viewbag.list1) 

Ho passato con alcuni esempi, ma nessuno di loro ha aiutato Selo fidi aiutami.

+0

_ "nessuno di loro mi ha aiutato. Per favore aiutatemi." _ Con _che cosa? Non hai mostrato cosa succede e cosa ti aspetti che accada. – CodeCaster

+0

Sto dicendo che gli esempi che ho vissuto non mi hanno aiutato. Voglio dire, anche selezionare più valori non funziona anche per me, anche se io uso ListBoxFor .. – user2436792

+0

_ "non funziona" _ anche non è utile. Che codice hai usato, cosa è successo e cosa ti aspettavi che accadesse? – CodeCaster

risposta

26

Quello che suggerisco è che il modello ha bisogno di avere un uno a molti relazione con gli oggetti nel proprio elenco a più di selezione.

Un esempio è un blog con più tag:

Il modello blog può apparire come:

public class Blog 
{ 
    public Blog() 
    { 
     Tags = new List<Tag>(); 
    } 

    public string BlogTitle{ get; set; } 
    public string Body{ get; set; } 
    public virtual ICollection<Tag> Tags{ get; set; } 
} 

E il vostro modello di tag in questo modo:

public int TagID{ get; set; } 
    public string TagName{ get; set; } 
    public virtual ICollection<Blog> Blogs{ get; set; } 

Ora vi consiglio di utilizzare a view model:

public class BlogViewModel 
{ 
    public Blog blog{ get; set; } 
    public List<int> SelectedTags { get; set; } 

    public virtual List<Tag> Tags{ get; set; } 

    public BlogViewModel() 
    { 

    } 

    public BlogViewModel(Blog _blog, List<Tag> _Tags) 
    { 
     blog = _blog; 
     Tags = _Tags; 
     SelectedTags = new List<int>(); 
    } 
} 

E infine nella Vista (che eredita dal ViewModel);

@Html.ListBoxFor(m => m.SelectedTags, 
new MultiSelectList(Model.Tags, "TagID", "Tag") 
, null) 

Il plugin JQuery scelto è eccellente per questo http://harvesthq.github.io/chosen/. Puoi usarlo con:

@Html.ListBoxFor(m => m.SelectedTags, 
new MultiSelectList(Model.Tags, "TagID", "Tag") 
, new { @class = "chzn-select", data_placeholder = "Tags..." }) 

Sostituirlo con il proprio modello e controller e questo dovrebbe risolvere il problema. Inoltre, questo funzionerà nel modulo per la creazione di un nuovo post sul blog, e per la modifica di un post esistente (aggiungendo e rimuovendo i tag)

edit:

nel vostro blog Crea azione di controllo, si sarebbe popolare questo come:

public ActionResult Create() 
    { 

     var blog = new Blog(); 
     var AllTags = from t in db.Tags 
          select t; 
     BlogViewModel viewModel = new BlogViewModel(blog, 
      Tags.ToList()); 

     return View(viewModel); 

    } 

    public ActionResult Create(BlogViewModel blogViewModel) 
    { 
     Blog blog = blogViewModel.blog; 

     if (blogViewModel.SelectedTags != null) 
     { 
      foreach (var TagID in blogViewModel.SelectedTags) 
      { 
       Tag tag = db.Tags.Where(t => t.TagID == TagID).First(); 
       blog.Tags.Add(tag); 
      } 
     } 
     db.Blog.Add(blog); 
     db.SaveChanges(); 
    } 
+0

Grazie per il tuo codice. come ottenere i valori selezionati nel controller ?? – user2436792

+0

Ho modificato la mia risposta per aggiungere un metodo di creazione che mostra come si dovrebbero trovare i valori selezionati – Evonet

+0

Questo è ottimo. Grazie, ma ho trovato una soluzione semplice ... grazie – user2436792

4

tenta di modificare la modelproperty ad un tipo di elenco di accettare più valori:

public IEnumerable<string> BusinessUnitSiteSafetyRepresentative { get; set; } 
1

Buona risposta da EvoNet. È un approccio diverso ma ha funzionato bene per me.

Ecco Microsofts mezzo ufficiale per farlo: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

Cerca: Un join tavolo è richiesto nel database, tuttavia, come mostrato nel seguente diagramma di database:

ho provato e sì ha creato la tabella ma ho dovuto iniziare a modificare il controller per farlo scrivere sul tavolo. Poi ho dovuto anche pensare a creare casi per quando una relazione esiste già, ecc.

Così ho modificato questo metodo che ha funzionato bene per me.

Problemi correlati