#c# #.net-core #asp.net-core-mvc #cqrs
Вопрос:
Я создаю ASP.NET Веб-приложение Core 5 MVC, и у меня проблема.
Просмотр отображает только одно и то же значение.
У меня есть отладка, и контроллер, кажется, в порядке.
Но я понятия не имею, почему в представлении отображается только 9 строк, а все строки одинаковы.
Вот код в контроллере:
public class MatchesController : Controller { private ISender _mediator; public MatchesController(ISender mediator) { _mediator = mediator; } public IActionResult Index() { return View(); } public async Tasklt;IActionResultgt; ViewAllMatch() { var matchQuery = await _mediator.Send(new GetMatchesDetail()); // ReUse model from Apllication Layer // Manual Mapping from matches to MatchViewModel // GetMatchesDetail : IRequestlt;IEnumerablelt;MatchesDetailgt;gt; // Manual Mapping IEnumerablelt;MatchesDetailgt; =gt;IEnumerablelt;MatchViewModelgt; MatchViewModel matchesvm = new MatchViewModel(); Listlt;MatchViewModelgt; retList = new Listlt;MatchViewModelgt;(); // IEnumerablelt;MatchesDetailgt; retList; foreach (var item in matchQuery) { matchesvm.MatchId = item.MatchId; matchesvm.MatchNumber = item.MatchNumber; matchesvm.DateMatch = item.DateMatch; matchesvm.TimeMatch = item.TimeMatch; matchesvm.MatchYear = item.MatchYear; matchesvm.SeasonId = item.SeasonId; matchesvm.SeasonName = item.SeasonName; matchesvm.Round = item.Round; matchesvm.Stage = item.Stage; matchesvm.SubStage = item.SubStage; matchesvm.HTeam = item.HTeam; matchesvm.HGoal = item.HGoal; matchesvm.HTeamCode = item.HTeamCode; matchesvm.GGoal = item.GGoal; matchesvm.GTeam = item.GTeam; matchesvm.GTeamCode = item.GTeamCode; matchesvm.WinNote = item.WinNote; matchesvm.Stadium = item.Stadium; matchesvm.Referee = item.Referee; matchesvm.Visistors = item.Visistors; retList.Add(matchesvm); } return View(retList); } }
А вот и вид:
@model IEnumerablelt;MatchViewModelgt; @{ ViewData["Title"] = "ViewAllMatch"; string flag1, flag2; } lt;h1gt;ViewAllMatchlt;/h1gt; lt;pgt; lt;a asp-action="Create"gt;Create Newlt;/agt; lt;/pgt; lt;table class="table"gt; lt;theadgt; lt;trgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.MatchId) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.MatchNumber) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.DateMatch) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.TimeMatch) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.MatchYear) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.SeasonId) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.SeasonName) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.Round) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.Stage) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.SubStage) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.HTeam) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.HTeamCode) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.HGoal) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.GGoal) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.GTeam) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.GTeamCode) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.WinNote) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.Stadium) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.Referee) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.Visistors) lt;/thgt; lt;thgt; @Html.DisplayNameFor(model =gt; model.Status) lt;/thgt; lt;thgt;lt;/thgt; lt;/trgt; lt;/theadgt; lt;tbodygt; @foreach (var item in Model) { lt;trgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.MatchId) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.MatchNumber) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.DateMatch) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.TimeMatch) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.MatchYear) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.SeasonId) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.SeasonName) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.Round) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.Stage) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.SubStage) lt;/tdgt; lt;td class="text-center"gt; @Html.DisplayFor(modelItem =gt; item.HTeam) lt;/tdgt; lt;tdgt; @{ flag1 = "/img/Team/" @item.HTeamCode ".png"; flag2= "/img/Team/" @item.GTeamCode ".png"; } lt;img src="@flag1" /gt; @*@Html.DisplayFor(modelItem =gt; item.HTeamCode)*@ lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.HGoal) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.GGoal) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.GTeam) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.GTeamCode) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.WinNote) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.Stadium) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.Referee) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.Visistors) lt;/tdgt; lt;tdgt; @Html.DisplayFor(modelItem =gt; item.Status) lt;/tdgt; lt;tdgt; @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) | @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) | @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ }) lt;/tdgt; lt;/trgt; } lt;/tbodygt; lt;/tablegt;
Комментарии:
1. Пожалуйста, поделитесь своими кодами просмотра и кодами контроллера, тогда мы сможем узнать, что произошло.
2. Спасибо за ваше предложение, я отредактировал вопрос так, как вы требовали.
Ответ №1:
Причина, по которой вы всегда получаете одно и то же значение, заключается в том, что ваша модель MatchViewModel является новой вне метода foreach. Это означает, что вы всегда добавляли одну и ту же модель MatchViewModel, и ее значение менялось во время каждого выполнения. Это приведет к тому, что в модель представления списка всегда будет добавлена одна и та же модель представления, как и в вашем представлении, всегда отображается одна и та же строка.
Я предлагаю вам попробовать следующие коды:
public async Tasklt;IActionResultgt; ViewAllMatch() { var matchQuery = await _mediator.Send(new GetMatchesDetail()); //ReUse model from Apllication Layer //Manual Mapping from matches to MatchViewModel //GetMatchesDetail : IRequestlt;IEnumerablelt;MatchesDetailgt;gt; //Manual Mapping IEnumerablelt;MatchesDetailgt; =gt;IEnumerablelt;MatchViewModelgt; Listlt;MatchViewModelgt; retList = new Listlt;MatchViewModelgt;(); //IEnumerablelt;MatchesDetailgt; retList; foreach (var item in matchQuery) { MatchViewModel matchesvm = new MatchViewModel(); #region ManualMapping matchesvm.MatchId = item.MatchId; matchesvm.MatchNumber = item.MatchNumber; matchesvm.DateMatch = item.DateMatch; matchesvm.TimeMatch = item.TimeMatch; matchesvm.MatchYear = item.MatchYear; matchesvm.SeasonId = item.SeasonId; matchesvm.SeasonName = item.SeasonName; matchesvm.Round = item.Round; matchesvm.Stage = item.Stage; matchesvm.SubStage = item.SubStage; matchesvm.HTeam = item.HTeam; matchesvm.HGoal = item.HGoal; matchesvm.HTeamCode = item.HTeamCode; matchesvm.GGoal = item.GGoal; matchesvm.GTeam = item.GTeam; matchesvm.GTeamCode = item.GTeamCode; matchesvm.WinNote = item.WinNote; matchesvm.Stadium = item.Stadium; matchesvm.Referee = item.Referee; matchesvm.Visistors = item.Visistors; #endregion retList.Add(matchesvm); } return View(retList); //return View(matches); //IEnumerablelt;MatchesDetailgt; }
Ответ №2:
У вас есть ошибка в коде, вы должны создать новый экземпляр MatchViewModel для каждого элемента внутри цикла
foreach (var item in matchQuery) { var matchesvm = new MatchViewModel(); matchesvm.MatchId = item.MatchId; ... and so on }
но вы можете использовать Linq вместо цикла foreach
var retList= matchQuery.Select(item=gt; new MatchViewModel { MatchId = item.MatchId; MatchNumber = item.MatchNumber; DateMatch = item.DateMatch .... and so on }).ToList(); return View(retList);
ИМХО нет особого смысла преобразовывать IEnumerable из MatchesDetail =gt; IEnumerable из MatchViewModel, так как у них одинаковые имена свойств, и вы используете их только для отображения данных. Вы можете использовать matchQuery напрямую
return View(matchQuery);
и посмотреть
@model IEnumerablelt;MatchesDetailgt;