【问题标题】:ASP.NET MVC 4 List<T> to ICollection<T>ASP.NET MVC 4 列表<T> 到 ICollection<T>
【发布时间】:2014-12-04 11:01:40
【问题描述】:

我的项目涉及将一组艺术家添加到一个活动中。目前,我有来自视图中复选框表单的艺术家列表,然后我有一个列表,其中填充了从表单中选择的艺术家。我正处于一个症结所在,因为我需要将该列表放入事件中(请参阅此处所需的 //code 注释)。之后我将对 Journal 类执行类似的操作。

型号

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>

【问题讨论】:

  • 你的复选框被命名为selectedArtists,但你的方法参数是artistsSelected,它不会绑定,如果它需要是string[] selectedArtistsform action="/Artist/AddToEvent/@ViewBag.Message"到底是什么?使用强类型的 html 帮助器来呈现您的 html - 难怪您有问题。并且参数int id 将始终为零。忘记这个使用视图模型来表示您想要显示和编辑的内容(包括Artistbool IsSelected 属性)

标签: c# asp.net-mvc-4 razor


【解决方案1】:

试试这个:

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

【讨论】:

  • 小心,event 是 C# 中的保留关键字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
相关资源
最近更新 更多