我有这些实体(它们之间存在多对多的连接):
public class Post
{
public Guid PostId { get; set; }
public string Name { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class Tag
{
public int TagId { get; set; }
public string Name { get; set; }
public virtual ICollection<Post> Posts { get; set; }
}
我希望用户在创建Post时,从MultiSelectList和MultiSelectList中选择数据,将该数据传递给Post.Tags。我怎么能这样做?
答案 0 :(得分:13)
我有类似的东西,一个产品属于很多类别,一个类别,有很多产品。
在我创建新产品的管理视图中,我能够允许用户选择应该列出此产品的类别的多个“标签”。
由于有这么多类别,我倾向于避免多选列表,并使用ajax自动建议来检索类别并使用jQuery插件(如TagIt)填充它们。
但为了简单起见,您可以在控制器中使用它
public class HomeController : Controller
{
public ActionResult Create()
{
var tags = new List<Tag>()
{
new Tag() { TagId = 1, Name = "Planes", Posts = new Collection<Post>() },
new Tag() { TagId = 2, Name = "Cars", Posts = new Collection<Post>() },
new Tag() { TagId = 2, Name = "Boats", Posts = new Collection<Post>() }
};
ViewBag.MultiSelectTags = new MultiSelectList(tags, "TagId", "Name");
return View();
}
[HttpPost]
public ActionResult Create(Post post, int[] tags) // Tags is not case-sensative from model binder when html element name="tags" <-- array passed back to controller
{
// Find Tag from Database
// Attach tag entity to Post
// foreach(var tagId in tags)
// var tag = context.Tags.find(tagId)
// post.Tags.Add(tag);
// context.SaveChanges();
return RedirectToAction("Create");
}
}
在View / Create.cshtml中
@model MvcApplication1.Models.Post
<h2>Create</h2>
@using (Html.BeginForm("Create", "Home", FormMethod.Post))
{
<label>Name</label>
@Html.TextBoxFor(model => model.Name)
<label>Tags For Post</label>
@Html.ListBox("Tags", (MultiSelectList)ViewBag.MultiSelectTags)
<input type="submit" value="Submit Post"/>
}
所有选定的标签:
然后,当在回发到控制器时选择多个时,您可以在调试中看到模型绑定器知道从html元素名称“tags”发回数组