Home > Software design >  Do I have to manipulate the Model data in Controller to pass to View?
Do I have to manipulate the Model data in Controller to pass to View?

Time:04-25

I have two tables: Cache (date (timestamp) and site) and SiteContent where I store words and their counts. One site has many SiteContents entries. I want to send SiteContents to View.

Cache:

        [Required]
        public string Site { get; set; }
        [Required]
        public DateTime Date { get; set; }
        public virtual ICollection<Cash> SiteContent { get; set; }

SiteContent:

        [Required]
        public int CashId { get; set; }
        public virtual Cache Site { get; set; }
        [Required]
        public string Word { get; set; }
        [Required]
        public uint Count { get; set; }

Code of controller:

public IActionResult Index()
        {
            //Console.WriteLine(_context.Caches.ToArray()[0].Site);
            //Console.WriteLine(_context.SiteContents.ToArray()[0].Word);
            //Console.WriteLine(_context.SiteContents.ToArray()[0].Site.Site);
            return View(_context.SiteContents.ToList());
        }

View code:

@using ParserWeb.Models
@model IEnumerable<SiteContent>
@{
    ViewData["Title"] = "Home Page";
}


<table >
    @foreach (SiteContent c in Model)
    {
            <tr> <td>@c.Site.Date</td> <td>@c.Site.Site</td> <td>@c.Word</td> <td>@c.Count</td> </tr>
    }
</table>

How come the code only works if I uncomment? Otherwise there is

System.NullReferenceException: "Object reference not set to an instance of an object."

CodePudding user response:

@foreach (SiteContent c in Model)
{
        <tr> <td>@c.Site.Date</td> <td>@c.Site.Site</td> <td>@c.Word</td> <td>@c.Count</td> </tr>
}

You wanna use @c.Site.Date but you don't include Site.

Site = null and you wanna use Site.Date, (property of null) that's the reason of exception.

Answer:

return View(_context.SiteContents.Include(s => s.Site).ToList());
  • Related