Search code examples
sitecoreglass-mappersitecore-mvcsitecore8

Sitecore Load all items into an MVC model?


I have created a bunch of custom templates to store items (such as Industries, Subindustries, etc.) in Sitecore. I now want to go about loading these into my Sitecore MVC model.


The lists are located in sitecore > Content > Lists. For example inside the Lists folder there is a folder called Country. I want to get back all the items within the Country folder and populate them as unordered list in my view.


UPDATE: I implemented the Glass.Mapper.Sc method suggested below. It is fully operational now.

This is what my working model looks like now:

using Glass.Mapper.Sc.Configuration;
using Glass.Mapper.Sc.Configuration.Attributes;
using Sitecore.Data.Items;
using Sitecore.Mvc.Presentation;
using System;
using System.Collections.Generic;

namespace Sitecore.Web.Models
{
    public class Registration: IRenderingModel
    {
        public Rendering Rendering { get; set; }
        public Item Item { get; set; }
        public Item PageItem { get; set; }

        public IEnumerable<CountryChildItem> CountryList { get; set; }

        [SitecoreType(AutoMap = true)]
        public class CountryItem
        {
            public virtual IEnumerable<CountryChildItem> Children { get; set; }
        }

        [SitecoreType(AutoMap = true)]
        public class CountryChildItem
        {
            [SitecoreId]
            public virtual Guid Id { get; set; }

            [SitecoreInfo(SitecoreInfoType.Path)]
            public virtual string Path { get; set; }

            [SitecoreField]
            public virtual string DisplayName { get; set; }

            [SitecoreField]
            public virtual string Abbreviation { get; set; }
        }

        public void Initialize(Rendering rendering)
        {
            Rendering = rendering;
            Item = rendering.Item;
            PageItem = PageContext.Current.Item;
        }
    }
}

and this is what my working contoller looks like:

using Glass.Mapper.Sc;
using Sitecore.Web.Models;
using System.Web.Mvc;

namespace Sitecore.Web.Controllers
{
    public class RegistrationController : Controller
    {
        Registration registrationModel = new Registration();

        public ActionResult Index()
        {
            ISitecoreContext sitecoreContext = new SitecoreContext();
            ISitecoreService service = new SitecoreService(sitecoreContext.Database);
            Registration.CountryItem countryItem = service.GetItem<Registration.CountryItem>("/sitecore/content/Lists/Country");
            registrationModel.CountryList = countryItem.Children;
            return View(registrationModel);
        }
    }
}

and a snippet of my working view:

 <ul class="select-menu-options dropdown-menu">
    @foreach (var country in Model.CountryList)
    {
        <li><a href="#">@country.DisplayName</a></li>
    }
 </ul>

Solution

  • If I were in your position I'd look into Glassmapper for Sitecore.

    It's a fairly lightweight ORM for Sitecore.

    http://www.glass.lu/Mapper/Sc

    I'd also suggest moving the lists located in

    sitecore > Templates > User Defined > Lists > Content 
    

    to some where under either

    sitecore > Content 
    

    or

    sitecore > System 
    

    (whichever makes more sence)

    UPDATE: Try adding this above your class:

    [SitecoreType(AutoMap =  true)]
    public class CountryItem
    {
        //...
    }