2014-12-04 74 views
-2

我的项目涉及添加一个艺术家集合到一个事件。目前,我从视图中的复选框表单中选择了艺术家列表,然后我从列表中选择了艺术家填充了一个列表。我处于一个棘手的问题,因为我需要将该列表放入事件中(请参阅此处需要的代码注释)。此后,我将在日记课上进行类似的操作。ASP.NET MVC 4列表<T>至ICollection <T>

型号

public class EventArtistModel 
{ 
    public int EventId { get; set; } 
    public string ArtistName { get; set; } 
    public string ArtistGenre { get; set; } 
} 

public class Event 
{ 
    public int Id { get; set; } 
    [DisplayName("Event Name")] 
    public string name { get; set; } 
    [DisplayName("Location")] 
    public string location { get; set; } 
    [DisplayName("Event Date")] 
    public string date { get; set; } 
    public virtual ICollection<Artist> Artists { get; set; } 
} 

public class Artist 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Genre { get; set; } 
    public virtual ICollection<Event> Events { get; set; } 
    public virtual ICollection<Journal> Journals { get; set; } 
} 

控制器

public ActionResult AddArtistToEvent(int id = 0) 
    { 
     Event even = db.Events.Find(id); 
     List<Artist> artists = even.Artists.Cast<Artist>().ToList(); 

     var model = db.Artists 
      .OrderBy(a => a.Name) 
      .Select(a => new EventArtistModel 
      { 
       EventId = id, 
       ArtistName = a.Name, 
       ArtistGenre = a.Genre 
      }); 
     return View(model); 
    } 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult AddToEvent(Artist[] artistsSelected, int id = 0) 
    { 
     List<Artist> artistList = new List<Artist>(); 
     foreach (Artist artist in artistsSelected) 
     { 
      artistList.Add(artist); 
     } 

     //code needed here 

     return RedirectToAction("Index"); 
    } 

查看

@model IEnumerable<EventJournal3.Models.EventArtistModel> 

@{ 
    ViewBag.Title = "Add an Artist To an Event"; 
} 

@section featured { 
    <section class="featured"> 
     <div class="content-wrapper"> 
      <hgroup class="title"> 
       <h1>@ViewBag.Title</h1> 
      </hgroup> 
     </div> 
    </section> 
} 

@foreach(var item in Model) 
{ 
    var id = item.EventId; 
    ViewBag.Message = id.ToString(); 
} 
<form action="/Artist/AddToEvent/@ViewBag.Message" method="post"> 
    <div class="container"> 
     <div class="row"> 
      <div class="col-xs-4"> 
       <ul> 
        @foreach (var item in Model) 
        { 
         var id = item.EventId; 
         <li> 
          @Html.DisplayFor(modelItem => item.ArtistName) 
          ~~ <input type="checkbox" name="selectedArtists" value="@item.ArtistName"/> 
         </li> 
        } 
       </ul> 
      </div> 
      <div class="col-xs-1"> 
       @if (User.IsInRole("Admin")) 
       { 
        <input type="submit" value="Add" class="btn btn-info" /> 
       } 
       | @Html.ActionLink("Back to List", "Index") 
      </div> 
     </div> 
    </div> 
</form> 
+1

您的复选框被命名为'selectedArtists',但您的方法参数是'artistsSelected'它不会绑定,并且它需要是'string [] selectedArtists'。什么是'form action =“/ Artist/AddToEvent/@ ViewBag.Message”'?使用强类型的HTML助手来呈现你的HTML - 难怪你有问题。参数'int id'将始终为零。忘记这是一个使用视图模型来表示你想要显示和编辑的东西(包括'Artist'的bool IsSelected'属性) – 2014-12-04 11:14:14

回答

0

试试这个:

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult AddToEvent(Artist[] artistsSelected, int id = 0) 
{ 
    Event _event = db.Events.Find(id); 
    foreach (Artist artist in artistsSelected) 
    { 
     _event.Artists.Add(artist); 
    } 

    return RedirectToAction("Index"); 
} 
+1

要注意,'event'是C#中的保留关键字 – 2014-12-04 11:35:39

+0

@MatiCicero好点。 – Rik 2014-12-04 11:47:59