Home > database >  Excpetion regarding Viewdata Dictionary
Excpetion regarding Viewdata Dictionary

Time:01-08

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.Dictionary2[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.

  •  Tags:  
  • Related