Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Ben Palmer 180 posts 866 karma points c-trib
    Apr 29, 2019 @ 12:11
    Ben Palmer
    0

    Accessing a Property Empties It

    Hi,

    I'm using Umbraco 8 to create a new website and trying to do something really simple but having no luck.

    I'm attempting to use a Surface Controller to render a list of events set up as content nodes. In my controller, I get the results but once they get passed through to my view and I try to access the events i.e. Model.Events.Any() somehow it seems to empty the property of all values.

    Here's the code:

    Homepage.cshtml:

    @using Index.Models.PublishedContent
    
    @inherits Umbraco.Web.Mvc.UmbracoViewPage<Homepage>
    
    @Html.Action("RenderUpcoming", "Events")
    

    EventsController.cs:

    using Index.Models.Events;
    using Index.Models.PublishedContent;
    using Papermoon.Umbraco.Kupo.Core.Services.Interfaces;
    using System;
    using System.Linq;
    using System.Web.Mvc;
    using Umbraco.Web.Mvc;
    
    namespace Index.Web.Controllers.Surface
    {
        public class EventsController : SurfaceController
        {
            private readonly KupoGeneralSettings _kupoGeneralSettings;
    
            public EventsController(IKupoSettingsService kupoSettingsService)
            {
                _kupoGeneralSettings = kupoSettingsService.GetSettings<KupoGeneralSettings>("kupoGeneralSettings");
            }
    
            public ActionResult RenderUpcoming()
            {
                UpcomingEventsModel model = new UpcomingEventsModel();
    
                model.Title = "Upcoming Events";
    
                model.Events = Umbraco.ContentAtXPath("root/homepage/events/event").Select(x => new Event(x));
    
                model.Events = model.Events.Where(x => x.StartDate > DateTime.Now).OrderBy(x => x.StartDate).Take(3);
    
                model.TotalEvents = model.Events.Count();
    
                model.EventListingLink = _kupoGeneralSettings.EventListingLink;
    
                return PartialView("~/Views/Partials/Events/UpcomingEvents.cshtml", model);
            }
        }
    }
    

    In the code above, Model.Events gets filled fine but when I then do Model.TotalEvents = model.Events.Count() the result is lost. I can show this better in a video: https://i.imgur.com/rE3VAqe.gifv

    It's worth noting that I've done similar in a different controller which seems to work fine.

    It also seems to do the same if I do a simple check like Model.Events != null

    At a total loss, any help would be massively appreciated!

    Thanks,

    Ben

  • Rhys Hamilton 140 posts 942 karma points
    Apr 29, 2019 @ 13:23
    Rhys Hamilton
    1

    You could try something like this instead:

    public ActionResult RenderUpcoming()
    {
        var getAllEvents = Umbraco.ContentAtXPath("root/homepage/events/event").Select(x => new Event(x)); 
        var events = getAllEvents.Where(x => x.StartDate > DateTime.Now).OrderBy(x => x.StartDate).Take(3);
    
        UpcomingEventsModel model = new UpcomingEventsModel()
        {
            Title = "Upcoming Events",
            Events = events,
            TotalEvents = events.Count(),
            EventListingLink = _kupoGeneralSettings.EventListingLink
        };
    
        return PartialView("~/Views/Partials/Events/UpcomingEvents.cshtml", model);
    }
    

    If your events returns null, then there could be a problem in your .Where clause. By writing your code this way, you only have to set the model.Events value once and makes for slightly easier debugging.

  • Ben Palmer 180 posts 866 karma points c-trib
    Apr 29, 2019 @ 13:26
    Ben Palmer
    0

    Thanks Rhys,

    This will actually get abstracted off into a service but this allowed me to debug so it's probably a bit messy!

    This doesn't actually fix my issue however, my where comes back with items just fine but whenever I try to do anything with it, the IEnumerable empties. I can literally be assigning the variable to the model property and by the time it gets there, it's empty.

    So, using your example, when I do getAllEvents.Where..., getAllEvents is emptied even though it has values before I attempt the Where.

    Thanks,

    Ben

  • Rhys Hamilton 140 posts 942 karma points
    Apr 29, 2019 @ 13:45
    Rhys Hamilton
    0

    Just so I can try set something up locally to replicate this, is getAllEvents emptied if you just do:

    var events = getAllEvents;
    
  • Ben Palmer 180 posts 866 karma points c-trib
    Apr 29, 2019 @ 13:50
    Ben Palmer
    1

    Yep correct, I've had some help over at Stack Overflow: https://stackoverflow.com/questions/55904475/c-sharp-ienumerable-emptied-once-accessed/55904526#55904526

    Simple solution is to cast to a list instead of an IEnumerable, full details in the above link.

    Done the IEnumerable thing millions of times in Umbraco 7 so seems like something might have actually changed in U8 to cause this.

    Thanks for the help btw!

  • Rhys Hamilton 140 posts 942 karma points
    Apr 29, 2019 @ 13:55
    Rhys Hamilton
    1

    Glad that you've found a solution and no problem at all.

    If you hadn't found the solution, my next port of call would've probably have been to have a further look into the getAllEvents variable, since that was empty in events that'd pinpoint that there was likely something up with the Umbraco.ContentAtXPath("root/homepage/events/event").Select(x => new Event(x)); line.

    Glad that things are resolved now though! :)

Please Sign in or register to post replies

Write your reply to:

Draft