通过 HTML BeginForm 传递列表和模型实例
Passing list and a model instance via HTML BeginForm
目前在学习asp.netmvc5的同时正在做一个项目。我的 Db 中有多对多关系,我正在研究一种解决方案,将一个 table 中的某些演员附加到另一个 table 中的电影。这是他们的模型。
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>
}
提交表单后,我们就到了controller
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。似乎列表是空的。我也相信我实际上没有电影的实例。现在我真的被困在这里了。
中的 BeginForm 使用这些适当的方法之一
首先尝试使用 FormMethod.Post
@using (Html.BeginForm("SaveActors", "Movies", FormMethod.Post)){
@** your code **@
}
如果它不起作用,请尝试使用 FormMethod.Post
旁边的 html 属性或检查 here
中的方法
您的复选框列表不会绑定回 post 上的模型,您需要以这种方式构建它,以便它使用和索引,并且它应该 post 回到您的控制器想要它。
@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>
}
目前在学习asp.netmvc5的同时正在做一个项目。我的 Db 中有多对多关系,我正在研究一种解决方案,将一个 table 中的某些演员附加到另一个 table 中的电影。这是他们的模型。
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>
}
提交表单后,我们就到了controller
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。似乎列表是空的。我也相信我实际上没有电影的实例。现在我真的被困在这里了。
首先尝试使用 FormMethod.Post
@using (Html.BeginForm("SaveActors", "Movies", FormMethod.Post)){
@** your code **@
}
如果它不起作用,请尝试使用 FormMethod.Post
旁边的 html 属性或检查 here
您的复选框列表不会绑定回 post 上的模型,您需要以这种方式构建它,以便它使用和索引,并且它应该 post 回到您的控制器想要它。
@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>
}