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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With