如何将参数从 View 传递给 Controller?
How to give a param from View to Controller?
我有一个非常愚蠢的问题。我的项目中有一个 foreach 循环:
@foreach (var item in Model.HallIndex!)
foreach 给我一个电影院的所有大厅+未来排定的电影,包括电影的时间。所以我从查询中得到这个回到我的网络应用程序:
电影院 1
正在播放:
下一部电影:尖叫(下午 3:00)
电影院 2:
正在播放:
下一部电影:泰坦尼克号(晚上 8:30)
等等……我想你到目前为止已经明白了。但!我想使用 Hallnumber 来获取另一个查询的结果,该查询从现在在每个大厅播放的数据库中获取电影。所以,我需要获取控制器的参数。
编辑
这是我真正尝试做的,但 MovieNow 不起作用:
控制器:
public async Task<ActionResult<IndexViewModel>> Index(int hallId)
{
IndexViewModel indexViewModel = new IndexViewModel();
indexViewModel.MovieIndex = MovieIndex();
indexViewModel.MovieNow = MovieNow(hallId);
indexViewModel.HallIndex = MovieNext();
return View(indexViewModel);
}
public Showtime MovieNow(int hallId)
{
return _context.Showtime.FromSqlRaw("SELECT * FROM db.\"Showtime\" S JOIN db.\"Movie\" M ON S.\"MovieId\" = M.\"Id\" WHERE \"StartAt\" < now() AND S.\"HallId\" = {0} ORDER BY \"StartAt\" DESC", hallId).FirstOrDefault();
}
ViewModel:
public class IndexViewModel
{
public Hall? Hall { get; set; }
public Movie? Movie { get; set; }
public IEnumerable<Showtime>? MovieIndex { get; set; }
public IEnumerable<Showtime>? HallIndex { get; set; }
public Showtime? MovieNow { get; set; }
}
查看:
<div class="col-4">
<div class="text-center index-hall-overview">
@foreach (var item in Model.HallIndex!)
{
<div class="row">
<p class="index-hall-title">CINEMA @Html.DisplayFor(model => item.HallId)</p>
<p class="index-hall-now">Now playing: @Html.DisplayFor(m => Model.MovieNow.Movie.Title, item.HallId) </p>
<p class="index-hall-next"><span class="index-hall-p">Next movie:</span> @Html.DisplayFor(model => item.Movie.Title)
@{
var startTime = item.StartAt.ToLocalTime().TimeOfDay.ToString(@"hh\:mm");
}
(@Html.DisplayFor(model => startTime))</p>
</div>
<hr class="index-hall-hr"/>
}
</div>
</div>
如果我这样做,我会得到错误:
“PostgresException:42702:列引用“Id”不明确 POSITION:8”
确保您传递的参数正确,因为您的代码看起来不错。
当您加入 Showtime 和 Movie table 时,SELECT *
将 return 来自 的所有列 tables。显然两者都包含一个 Id 列,因此应该使用哪个来填充 Id 属性?
解决方案:使用 SELECT s.*
将列 return 限制为正确的 table
很可能是因为您在视图中指向相同的 ID DisplayFor(model => item.HallId)
。
我有一个非常愚蠢的问题。我的项目中有一个 foreach 循环:
@foreach (var item in Model.HallIndex!)
foreach 给我一个电影院的所有大厅+未来排定的电影,包括电影的时间。所以我从查询中得到这个回到我的网络应用程序:
电影院 1
正在播放:
下一部电影:尖叫(下午 3:00)
电影院 2:
正在播放:
下一部电影:泰坦尼克号(晚上 8:30)
等等……我想你到目前为止已经明白了。但!我想使用 Hallnumber 来获取另一个查询的结果,该查询从现在在每个大厅播放的数据库中获取电影。所以,我需要获取控制器的参数。
编辑
这是我真正尝试做的,但 MovieNow 不起作用:
控制器:
public async Task<ActionResult<IndexViewModel>> Index(int hallId)
{
IndexViewModel indexViewModel = new IndexViewModel();
indexViewModel.MovieIndex = MovieIndex();
indexViewModel.MovieNow = MovieNow(hallId);
indexViewModel.HallIndex = MovieNext();
return View(indexViewModel);
}
public Showtime MovieNow(int hallId)
{
return _context.Showtime.FromSqlRaw("SELECT * FROM db.\"Showtime\" S JOIN db.\"Movie\" M ON S.\"MovieId\" = M.\"Id\" WHERE \"StartAt\" < now() AND S.\"HallId\" = {0} ORDER BY \"StartAt\" DESC", hallId).FirstOrDefault();
}
ViewModel:
public class IndexViewModel
{
public Hall? Hall { get; set; }
public Movie? Movie { get; set; }
public IEnumerable<Showtime>? MovieIndex { get; set; }
public IEnumerable<Showtime>? HallIndex { get; set; }
public Showtime? MovieNow { get; set; }
}
查看:
<div class="col-4">
<div class="text-center index-hall-overview">
@foreach (var item in Model.HallIndex!)
{
<div class="row">
<p class="index-hall-title">CINEMA @Html.DisplayFor(model => item.HallId)</p>
<p class="index-hall-now">Now playing: @Html.DisplayFor(m => Model.MovieNow.Movie.Title, item.HallId) </p>
<p class="index-hall-next"><span class="index-hall-p">Next movie:</span> @Html.DisplayFor(model => item.Movie.Title)
@{
var startTime = item.StartAt.ToLocalTime().TimeOfDay.ToString(@"hh\:mm");
}
(@Html.DisplayFor(model => startTime))</p>
</div>
<hr class="index-hall-hr"/>
}
</div>
</div>
如果我这样做,我会得到错误: “PostgresException:42702:列引用“Id”不明确 POSITION:8”
确保您传递的参数正确,因为您的代码看起来不错。
当您加入 Showtime 和 Movie table 时,SELECT *
将 return 来自 的所有列 tables。显然两者都包含一个 Id 列,因此应该使用哪个来填充 Id 属性?
解决方案:使用 SELECT s.*
很可能是因为您在视图中指向相同的 ID DisplayFor(model => item.HallId)
。