2013-03-17 11 views
5

mam te podmioty (nie ma wiele do wielu między nimi powiązanie):MVC 4 MultiSelect lista & EF wiele do wielu

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

Chciałbym użytkownika, gdy tworzy Post, aby wybrać dane z MultiSelectList i MultiSelectList, aby przekazać te dane do Post.Tags. Jak mogę to zrobić ?

Odpowiedz

13

Mam coś podobnego, produkt należy do wielu kategorii i kategorii, ma wiele produktów.

W moim widoku administracyjnym do tworzenia nowych produktów, jestem w stanie pozwolić użytkownikowi wybrać wiele "znaczników" kategorii, na których ten produkt powinien być wymieniony.

Z powodu tak wielu kategorii staram się unikać list wielokrotnego wyboru i używać pewnego rodzaju auto sugestii z ajaxem do pobierania kategorii i zapełniania ich za pomocą wtyczki jQuery, takiej jak TagIt.

Ale dla uproszczenia można wykorzystać to w swoim kontrolerze

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

} 

A wewnątrz Widok/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"/> 
} 

wszystkie Wybrane tagi:

Następnie po wybraniu wielu przy wysyłaniu z powrotem do kontrolera możesz se e w debugowania, że ​​spoiwo modelu wie wysłać tablicę z powrotem z html nazwy elementu „tagi”

+0

Jaki byłby najlepszy sposób zaktualizować znaczniki podczas edycji? Ass niektóre mogą być dodawane lub usuwane – MrBeanzy

+1

Mieć stronę edycji wstępnie wypełnić kilka pól wyboru i przekazać je w ten sam sposób poprzez 'tagi [int] [] lub pole mutli-select. Działa to tak samo z tworzeniem, aktualizowaniem lub usuwaniem. –