Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

The model item passed into the ViewDataDictionary is of type X[] but this ViewDataDictionary instance requires a model item of type X [duplicate]

Tags:

c#

asp.net-mvc

Error:

InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'Test.Models.Ticket[]', but this ViewDataDictionary instance requires a model item of type 'Test.Models.Ticket'.

Hello,
After staring at an error for a few days and doing some research, I've determined that I don't know enough about MVC to solve this problem. I understand enough to know that my controller is trying to pass an array to the view, but that the view is not looking for an array(?). Below is the code:

Controller:

//this is supposed to take the last five "tickets" created from a database
[Route("Ticket")]
public IActionResult Index(int page = 0)
{
    var model = _db.Tickets.OrderByDescending(x => x.Time).Take(5).ToArray();
    return View(model);
}

View: (file is titled "Index.cshtml" under the "Ticket" folder within the "Views" folder)

@model IEnumerable<Test.Models.Ticket>
@{
    Layout = "_Layout";
}

<p>Below is supposed to display the latest 5 "tickets" from a database.</p>

<div class="ticket-create">
    @foreach (var ticket in Model)
    {
        @Html.Partial("_Ticket", ticket)
    }
</div>

Partial View "_Ticket":

@model Test.Models.Ticket

<article class="ticket-create">
    <h1>@Html.ActionLink(Model.Type, "Create", "Ticket", new { year = Model.Time.Year, month = Model.Time.Month, day = Model.Time.Day, time = Model.Time.TimeOfDay, key = Model.Key })</h1>
    <div class="type">
        Created on <span>@Model.Time</span> by <span>@Model.Name</span>
    </div>
    <div class="desc">
        @Model.Desc
    </div>
    <div class="clearance">
        @Model.Clearance
    </div>
</article>

Model "Ticket":

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Test.Models
{
    public class Ticket
    {
        public long Id { get; set; }

        private string _key;

        public string Key
        {
            get
            {
                if(_key == null)
                {
                    _key = Regex.Replace(Name.ToLower(), "[^a-z0-9]", "-");
                }
                return _key;
            }
            set { _key = value; }
        }

        [Required]
        [DataType(DataType.Text)]
        public string Type { get; set; }

        [Required]
        [DataType(DataType.Text)]
        public string Name { get; set; }

        [StringLength(300, MinimumLength = 5, ErrorMessage = "The description must be between 5 and 300 characters long.")]
        [DataType(DataType.MultilineText)]
        public string Desc { get; set; }

        [DataType(DataType.DateTime)]
        public DateTime Time { get; set; }

        [Required]
        [DataType(DataType.Text)]
        public string Clearance { get; set; }

        [DataType(DataType.Text)]
        public string Author { get; set; }
    }
}

_Layout.cshtml declares the following model: "@model Test.Models.Ticket"

I read through a wonderful post located here, but while I think that helped me an awful lot in many aspects of my understanding of what's happening, I am still finding the error difficult to resolve.

like image 736
DocHound Avatar asked Jul 17 '18 19:07

DocHound


1 Answers

The problem is that the Layout the View is using expects a model of Ticket and you are passing it a Ticket[] (notice that this is done implicitly when you use return View(model)).

Normally, since the Layout is used through multiple Views, the Layout does not declare a @model. Removing the @model from the Layout will solve your problem.

like image 56
Camilo Terevinto Avatar answered Nov 15 '22 21:11

Camilo Terevinto