Передача списка и экземпляра модели через HTML BeginForm

В настоящее время я делаю проект, изучая asp.net mvc5. У меня есть отношения «многие ко многим» в моей базе данных, и я работаю над решением, позволяющим прикрепить определенных актеров из одной таблицы к фильмам из другой таблицы. Вот модели для них.

public class Movie
{
    public Movie()
    {
        this.Actors = new HashSet<Actor>();
        this.Customers = new HashSet<Customer>();
    }

    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Genre { get; set; }
    [Required]
    public DateTime ReleaseDate { get; set; }
    [Required]
    public DateTime AddDate { get; set; }
    public virtual ICollection<Actor> Actors { get; set; }
    public virtual ICollection<Customer> Customers { get; set; }

}
public class Actor
{
    public Actor()
    {
        this.Movies = new HashSet<Movie>();
    }
    public int id { get; set; }
    [Required]
    public string Name { get; set; }
    public virtual ICollection<Movie> Movies { get; set; }
    public DateTime BirthDate { get; set; }
}

Поэтому я придумал проверять актеров на странице AddActors и добавлять их в выбранный фильм. Вот как это выглядит:

@model Movie_Rentals.ViewModels.AddActorViewModel
@{
    ViewBag.Title = "AddActors";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Add Actors Form</h2>
@using (Html.BeginForm("SaveActors", "Movies"))
{
foreach (var a in Model.Actors)
{
    <ul>
        <input type="checkbox" name="addactors" value="@Model.Actors" />
            @Html.DisplayFor(modelItem => a.Name);
        <br />
    </ul>
}
@Html.HiddenFor(m => m.Movie)
<button type="submit" class="btn btn-primary">Save</button>
}

После отправки формы попадаем в контроллер

public ActionResult SaveActors(FormCollection formCollection)
    {
        var movieInDb = /*???*/;
        {
            foreach (/*var actor in formCollection*/)
            {
                movieInDb.Actors.Add(actor);
            }
            _context.SaveChanges();
        }
        return RedirectToAction("Details", "Movies", new { id = movieInDb.Id });

    }

Вопрос в том, как мне получить фильм и актеров из этой формы, которую я передал контроллеру? Есть ли другой способ передать список проверенных актеров и фильм контроллеру вместо использования HTML BeginForm?

UPD. Я обнаружил, что данные будут связаны, если я использую HTML BeginForm, поэтому вместо передачи FormCollection контроллеру я попытался передать фильм и список актеров, чтобы увидеть, будет ли это помогите мне любым способом. Итак, теперь контроллер, который сохраняет результаты в Db, выглядит так

public ActionResult SaveActors(List <Actor> actors, Movie movie)
    {
        foreach (var a in actors)
        {
            movie.Actors.Add(a);
        }
        _context.SaveChanges();

        return RedirectToAction("Details", "Movies", new { id = movie.Id });
    }

Но я получаю исключение System.NullReferenceException. Кажется, список пуст. Также я считаю, что на самом деле у меня нет экземпляра фильма. Теперь я действительно застрял здесь.


person Andrew Stepanenko    schedule 27.04.2020    source источник


Ответы (2)


Ваш список флажков не будет привязан к модели при публикации, вам нужно построить ее таким образом, чтобы она использовала и индексировала, и она должна отправлять обратно на ваш контроллер, как вы этого хотите.

@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
    <ul>
    @for (int idx = 0; idx < Model.Actors.Count; idx++) {
        <li>
          @Html.HiddenFor(x=>Model.Actors[idx].ID)
          @Html.CheckBoxFor(x=>Model.Actors[idx].IsSelected)
          @Html.DisplayFor(x => Model.Actors[idx].Name)
           @Html.HiddenFor(x => Model.Actors[idx].HobbiesName)
        </li>

    }
    </ul>
    }
person Damian70    schedule 28.04.2020

используйте один из этих подходящих методов для BeginForm из документации здесь

Прежде всего попробуйте использовать FormMethod.Post

@using (Html.BeginForm("SaveActors", "Movies", FormMethod.Post)){
           @** your code **@
}

Если это не работает, попробуйте использовать атрибуты html рядом с FormMethod.Post
или проверьте методы из здесь

person Mohammad ABS Jabed    schedule 27.04.2020
comment
Хорошо, теперь мой фильм передается из моего представления в контроллер, но он по-прежнему не возвращает список актеров. Это начало, теперь я понимаю, что проблема может быть связана с флажками. - person Andrew Stepanenko; 28.04.2020
comment
да, вы должны собрать проверенные элементы, которые должны быть переданы вашему контроллеру здесь, из BeginFrom. - person Mohammad ABS Jabed; 29.04.2020