Посмотреть в ASP.NET Дисплей Core 5 MVC по мере необходимости

#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;