I'm the getting following exception in my application and I don't know how to solve it.
An unhandled exception occurred while processing the request. InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.Dictionary
2[ProjetoFinalMVC.Models.Especializacao,System.Collections.Generic.List1[ProjetoFinalMVC.Models.Consulta]]', but this ViewDataDictionary instance requires a model item of type 'System.Collections.Generic.IEnumerable1[System.Linq.IGrouping2[ProjetoFinalMVC.Models.Especializacao,ProjetoFinalMVC.Models.Consulta]]'.
I have this function in the Service
public async Task<Dictionary<Especializacao, List<Consulta>>> EncontrarGrupoAsync(DateTime? minDate, DateTime? maxDate)
{
var consultas = await EncontrarDataAsync(minDate, maxDate);
var especializacoes = await _contexto.Especializacao.ToListAsync();
var grouping = new Dictionary<Especializacao, List<Consulta>>();
especializacoes.ForEach(e =>
{
var consulta = consultas.Where(c => c.Doutor.Especializacao == e).ToList();
grouping.Add(e, consulta);
});
return grouping;
}
And I call it in the Controller
public async Task<IActionResult> BuscaGrupo(DateTime? minDate, DateTime? maxDate)
{
if (!minDate.HasValue)
{
minDate = new DateTime(DateTime.Now.Year, 1, 1);
}
if (!maxDate.HasValue)
{
maxDate = DateTime.Now;
}
ViewData["minDate"] = minDate.Value.ToString("yyyy-MM-dd");
ViewData["maxDate"] = maxDate.Value.ToString("yyyy-MM-dd");
var resultado = await _consultasService.EncontrarGrupoAsync(minDate, maxDate);
return View(resultado);
}
In the method's view I have this model
@model IEnumerable<IGrouping<Especializacao,Consulta>>
What can I be doing wrong?
I've tried to return a dictionary in the view, but I don't know how.
If I change the model to
@model Dictionary<Especializacao, List<Consulta>>
I get an error in this line , saying it's not possible to use a foreach in key values pair
@foreach (var especialiGroup in Model)
@*
@model IEnumerable<IGrouping<Especializacao,Consulta>>
*@
@model Dictionary<Especializacao, List<Consulta>>
@{
ViewData["Title"] = "Pesquisar consultas";
DateTime minDate = DateTime.Parse(ViewData["minDate"] as string);
DateTime maxDate = DateTime.Parse(ViewData["maxDate"] as string);
<h2>@ViewData["Title"]</h2>
<nav >
<div >
<form role="search">
<div >
<div >
<label for="minDate">Data Inicial</label>
<input type="date" name="minDate" value=@ViewData["minDate"] />
</div>
<div >
<label for="maxDate">Data Final</label>
<input type="date" name="maxDate" value=@ViewData["maxDate"] />
</div>
</div>
<button type="submit" >Pesquisar</button>
</form>
</div>
</nav>
@foreach (var especialiGroup in Model)
{
<div >
<div >
<h3 >Especialização @especialiGroup.Key.Nome, Total de consultas: @especialiGroup.Key.TotalDeConsultas(minDate,maxDate)</h3>
</div>
<div >
<table >
<thead>
<tr >
<th>
Data
</th>
<th>
Valor
</th>
<th>
Doutor
</th>
</tr>
</thead>
<tbody>
@foreach (var item in especialiGroup)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Data)
</td>
<td>
@Html.DisplayFor(modelItem => item.Valor)
</td>
<td>
@Html.DisplayFor(modelItem => item.Doutor.Nome)
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
}
}
CodePudding user response:
you are sending from the controller to view this model
Dictionary<Especializacao, List<Consulta>
but your view is expecting
@model IEnumerable<IGrouping<Especializacao,Consulta>>
probably you should create ViewModel and convert dictionary to ViewModel in BuscaGrupo action
public class ViewModel
{
public List<Consulta> listConsulta {get; set;}
}
and view
@model ViewModel
CodePudding user response:
I solved the issue just putting this line inside the foreach
@foreach (var item in especialiGroup.Value)
Now it's working.
