it-swarm.com.de

So erhalten Sie multiselected Dropdown-Listenwerte in asp.net mvc

Ich habe ein Problem, um mehrere Dropdown-Listenwerte zu erhalten. Ich kann vorschlagen, mehrere Dropdown-Listenwerte auszuwählen und sie in den Controller zu bekommen.

Mein Code ist wie folgt: -

Modell

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

Nun, ich kann abrufen, ob ein einzelner Wert ausgewählt ist, und kann in DB speichern. Aber wie soll ich mehrere Werte auswählen und sie in den Controller laden, um sie zu speichern.

Hinweis: - Ich rufe die Dropdown-Listenwerte von DB ab, wie oben gezeigt.

Aussicht

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

Ich habe einige Beispiele durchgegangen, aber keines davon hat mir geholfen. Bitte helfen Sie mir.

6
user2436792

Ich schlage vor, dass Ihr Modell eine eins zu viele Beziehung zu den Elementen in Ihrer Multi-Select-Liste haben muss.

Ein Beispiel ist ein Blog mit mehreren Tags:

Ihr Blog-Modell könnte folgendermaßen aussehen:

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

Und dein Tag-Modell gefällt mir so:

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

Jetzt empfehle ich, ein Ansichtsmodell zu verwenden:

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

Und schließlich in Ihrer Ansicht (die von ViewModel erbt);

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

Das JQuery-Chosen-Plugin eignet sich hervorragend dafür http://harvesthq.github.io/chosen/ . Sie können es verwenden durch:

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

Ersetzen Sie dies durch Ihr eigenes Modell und Ihre eigenen Steuerungen, um das Problem zu lösen. Dies funktioniert auch in Ihrem Formular zum Erstellen eines neuen Blogbeitrags und zum Bearbeiten eines vorhandenen Posts (Hinzufügen und Entfernen von Tags).

bearbeiten:

In Ihrer Blog-Controller-Aktion erstellen würden Sie Folgendes auffüllen:

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

Versuchen Sie, Ihre modeleigenschaft in einen Listentyp zu ändern, um mehrere Werte zu akzeptieren:

public IEnumerable<string> BusinessUnitSiteSafetyRepresentative { get; set; }
5
Jan

Gute Antwort von EvoNet. Es ist ein anderer Ansatz, hat aber gut für mich funktioniert.

Hier ist Microsofts offizieller Weg, dies zu tun: http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for -an-asp-net-mvc-anwendung

Suchen Sie nach: In der Datenbank ist jedoch eine Join-Tabelle erforderlich, wie im folgenden Datenbankdiagramm gezeigt:

Ich habe es ausprobiert und ja, die Tabelle wurde erstellt, aber ich musste den Controller bearbeiten, damit er in die Tabelle geschrieben werden konnte. Dann musste ich auch darüber nachdenken, Fälle zu erstellen, wenn bereits eine Beziehung besteht usw.

Also habe ich auf diese Methode zurückgegriffen, die für mich gut funktioniert hat.

1
ozzy432836