Передача списка и экземпляра модели через HTML BeginForm - PullRequest
0 голосов
/ 27 апреля 2020

В настоящее время я делаю проект, изучая 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 });

    }

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

UPD. Я обнаружил, что данные будут быть связанным, если я использую HTML BeginForm, поэтому вместо передачи FormCollection в контроллер я попытался передать mov ie и список актеров, чтобы посмотреть, поможет ли это мне каким-либо образом. Итак, теперь контроллер, который сохраняет результаты в 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. Кажется, список пуст. Также я считаю, что у меня нет экземпляра mov ie. Теперь я действительно застрял здесь.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

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

@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>
    }
0 голосов
/ 27 апреля 2020

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

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

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

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

...