2013-06-10 12 views
6

Mam problem, aby uzyskać wiele list listy rozwijanej wartości. Czy ktoś może zaproponować mi, jak wybrać wiele list dropdownlist, jak również, jak je uzyskać w kontrolerze.Jak uzyskać multiselected wartości listy rozwijanej w asp.net mvc

Mój kod to tak: -

model

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

Cóż, mogę dostać jeśli jedna wartość jest wybrana & można zapisać do DB .Ale jak wybrać wiele wartości, a także, aby je uzyskać w Contr oller, aby je uratować.

Uwaga: - Pobieram wartości dropdownlist z DB, jak pokazano powyżej.

Zobacz

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

I już przez niektóre przykłady, ale żaden z nich nie pomógł me.Please mi pomóc.

+0

_ "żaden z nich mi nie pomógł. Proszę mi pomóc." _ Z _ co? Nie pokazałeś, co się dzieje i czego się spodziewasz. – CodeCaster

+0

Mówię, że przykłady, przez które przeszedłem, nie pomogły mi. Mam na myśli, nawet wybierając wiele wartości również nie działa dla mnie, mimo że używam ListBoxFor .. – user2436792

+0

_ "nie działa" _ również nie jest pomocne. Z jakiego kodu korzystałeś, co się stało i czego oczekiwałeś? – CodeCaster

Odpowiedz

26

Co sugeruję, że dany model musi mieć od jednego do wielu relacji z wielu elementów w liście wyboru.

Przykładem jest blog z wieloma tagami:

Twój model blog może wyglądać następująco:

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

i Twojego modelu tag tak:

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

Teraz zaleca się korzystanie model widoku:

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

I wreszcie w twoim widoku (który dziedziczy z ViewModel);

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

Wtyczka jQuery Chosen jest doskonała do tego http://harvesthq.github.io/chosen/. Możesz go użyć:

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

Zastąp to swoim własnym modelem i kontrolerami, co powinno rozwiązać Twój problem. Ponadto, będzie to działać w formularzu tworzenia nowego blogu, a dla edycji istniejącego post (dodawanie i usuwanie znaczników)

edit:

na swoim blogu Tworzenie akcji kontrolera, należy wypełnić to jako:

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

Dzięki za twój kod. jak uzyskać wybrane wartości w kontrolerze? – user2436792

+0

Edytowałem swoją odpowiedź, aby dodać metodę create, która pokazuje, w jaki sposób można znaleźć wybrane wartości. – Evonet

+0

To świetnie. Dziękuję, ale znalazłem proste rozwiązanie .. thanks – user2436792

4

Spróbuj zmienić modelproperty do typu listy przyjąć wiele wartości:

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

Dobra odpowiedź od EvoNet. Jest to inne podejście, ale działa dobrze dla mnie.

Oto Microsoftu oficjalny sposób, aby to zrobić: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

Szukaj: JOIN tabela jest wymagana w bazie danych, jednak, jak pokazano na poniższym schemacie bazy danych:

ja spróbowałem i tak Stworzyło to stół, ale musiałem rozpocząć edycję kontrolera, aby zmusić go do napisania tabeli. Potem musiałem też pomyśleć o tworzeniu przypadków, gdy związek już istnieje.

Tak więc przywiązałem się do tej metody, która sprawdziła się dla mnie.

Powiązane problemy