如何在asp.net mvc中获取多选Dropdownlist值

时间:2013-06-10 10:41:22

标签: asp.net-mvc razor

我有一个问题是获得多选下拉列表值。任何人都建议我如何获取选择多个下拉列表值以及如何在控制器中获取它们。

我的代码是这样的: -

模型

public string BusinessUnitSiteSafetyRepresentative { get; set; }

控制器

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

好吧,如果选择了单个值,我可以获得&可以保存到DB.But如何选择多个值以及在Controller中获取它们以保存它们。

注意: - 我正在从DB中检索下拉列表值,如上所示。

查看

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

我已经通过了一些例子,但没有一个帮助过我。请帮助我。

3 个答案:

答案 0 :(得分:28)

我建议您的模型需要与多选列表中的项目保持一对多的关系。

一个例子是带有多个标签的博客:

您的博客模型可能如下所示:

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

你的标签模型如下:

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

现在我建议您使用视图模型:

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

最后在你的View中(继承自ViewModel);

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

JQuery Chosen插件非常适合这个http://harvesthq.github.io/chosen/。您可以通过以下方式使用它:

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

将此替换为您自己的型号和控制器,这应该可以解决您的问题。此外,这将在您的表单中用于创建新的博客帖子,以及用于编辑现有帖子(添加和删除标签)

编辑:

在您的博客创建控制器操作中,您将其填充为:

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

答案 1 :(得分:5)

尝试将modelproperty更改为列表类型以接受多个值:

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

答案 2 :(得分:1)

EvoNet的答案很好。它是一种不同的方法,但对我来说效果很好。

以下是微软官方的做法:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/creating-a-more-complex-data-model-for-an-asp-net-mvc-application

搜索: 但是,数据库中需要连接表,如以下数据库图所示:

我试过了,是的,它创建了表,但我必须开始编辑控制器,让它写入表。然后我还要考虑为关系已经存在等等创建案例。

所以我对这种适合我的方法很有兴趣。