Промежуточная таблица скрыта платформой Entity, но не беспокойтесь, у mvc есть потрясающая функция, которая ViewModel
позволяет вам выполнять свою работу, что означает, что вы можете создать представление для промежуточной таблицы, например MoviesActors
Так что,
1) Вы должны создать одну модель представления для промежуточной таблицы, например
public class MoviesActorsViewModel
{
public MoviesActorsViewModel()
{
mvz = new Movies();
act = new Actors();
}
public Movies mvz { get; set; }
public Actors act { get; set; }
}
2) Добавить вид для вышеупомянутой модели типа
public ActionResult GetView()
{
MoviesActorsViewModel mcvm = new MoviesActorsViewModel();
return View(mcvm);
}
3) Тогда ваш взгляд на описанный выше метод действия похож на
.
Приведенная ниже бритва предназначена только для вашего понимания. Ваша фактическая бритва может отличаться от этой.
@model WebApplication2.Controllers.MoviesActorsViewModel
@{
ViewBag.Title = "GetView";
}
<h2>GetView</h2>
@using (Html.BeginForm("Create", "Default", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>MoviesActorsViewModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
//mvz fields below
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.TextBoxFor(model => model.mvz.movie_title, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.TextBoxFor(model => model.mvz.genre, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
//act fields below
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.TextBoxFor(model => model.act.actor_name, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.TextBoxFor(model => model.act.country_of_birth, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
4) После того, как вы отправите форму, ваш метод записи добавит ваши mvz
и act
как
[HttpPost]
public ActionResult Create(MoviesActorsViewModel mcvm)
{
_context.mvz.Add(mcvm.mvz);
_context.actrs.Add(mcvm.act);
return RedirectToAction("GetView", "Default");
}
Примечание : приведенный выше фрагмент кода предназначен для одного фильма и одного актера.
Поэтому, если вы хотите добавить нескольких актеров в один фильм, измените свойство act
в MoviesActorsViewModel
на List
Например, public List<Actors> act { get; set; }
, добавьте несколько текстовых полей в поле зрения и после отправки формы в метод действия Create
добавьте несколько таких акторов, как _context.actrs.AddRange(mcvm.act);
Edit:
Я тоже должен зарегистрировать нового актера. Но я хочу выбрать актеров из таблицы актеров и назначить их для новых регистрируемых фильмов.
Если при добавлении нового фильма вам нужно назначить нескольких актеров для фильма,
1) Вы просматриваете модель
public class MoviesActorsViewModel
{
public MoviesActorsViewModel()
{
mvz = new Movies();
act = new List<Actors>();
}
public Movies mvz { get; set; }
public List<Actors> act { get; set; }
public string[] ids { get; set; }
}
2) Заполните ваши актеры из базы данных, чтобы просмотреть список действий модели из вашего метода действия get view
public ActionResult GetView()
{
MoviesActorsViewModel mcvm = new MoviesActorsViewModel();
mcvm.act = _context.actrs.ToList();
return View(mcvm);
}
3) В режиме просмотра бритвы необходимо ввести один фильм и выбрать для него несколько актеров, затем просто установить флажок для каждого из акторов и добавить соответствующие значения id
в массив, а затем передать этот массив с отправкой формы.
@model WebApplicationMVC1.Controllers.MoviesActorsViewModel
<script src="https://code.jquery.com/jquery-3.3.1.min.js"
integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
crossorigin="anonymous"></script>
@{
ViewBag.Title = "GetView";
}
<h2>GetView</h2>
@using (Html.BeginForm("Create", "Default1", FormMethod.Post))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>MoviesActorsViewModel</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
//mvz fields below
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.TextBoxFor(model => model.mvz.movie_title, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
@Html.TextBoxFor(model => model.mvz.genre, new { htmlAttributes = new { @class = "form-control" } })
</div>
</div>
//act fields below from list of actors
@foreach (var item in Model.act)
{
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<div class="checkbox control-group">
<label>
<!-- SEE id property here, I've made it dynamic -->
<input type="checkbox" id="cb_@item.Id" value="@item.Id" class="checkBoxClass" />
<label>@item.actor_name</label>
</label>
</div>
</div>
</div>
}
<div>
<input type="hidden" name="ids" id="ids" />
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
<script>
$(function () {
var ids = [];
$(".checkBoxClass").change(function () {
if (this.checked) {
ids.push(this.value);
}
else {
var index = ids.indexOf(this.value);
ids.splice(index, 1);
}
$('#ids').val(ids);
});
});
</script>
4) После того, как вы отправите форму для действия ниже, вы можете просмотреть каждого из id
актера и сохранить его в базе данных с фильмом
[HttpPost]
public ActionResult Create(MoviesActorsViewModel mcvm)
{
_context.mvz.Add(mcvm.mvz);
foreach (var id in mcvm.ids)
{
int id1 = Convert.ToInt32(id);
Actors act = _context.actrs.Find(x => x.Id == id1);
_context.actrs.Add(act);
}
return RedirectToAction("GetView", "Default");
}