Sitecore Загрузить все элементы в модель MVC?

Я создал несколько пользовательских шаблонов для хранения элементов (таких как Industries, Subindustries и т. д.) в Sitecore. Теперь я хочу загрузить их в мою модель Sitecore MVC.


Списки находятся в разделе sitecore > Content > Lists. Например, внутри папки Списки есть папка с названием Страна. Я хочу вернуть все элементы внутри папки Country и заполнить их в виде неупорядоченного списка, на мой взгляд.


ОБНОВЛЕНИЕ: я применил метод Glass.Mapper.Sc, предложенный ниже. Сейчас он полностью функционирует.

Вот как сейчас выглядит моя рабочая модель:

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;
        }
    }
}

и вот как выглядит мой рабочий контроллер:

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);
        }
    }
}

и фрагмент моего рабочего вида:

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

person eat-sleep-code    schedule 31.08.2015    source источник
comment
Вопрос очень общий - может быть, перечислите, что вы уже пробовали для получения данных? Многое будет зависеть от настройки вашего дерева контента Sitecore.   -  person Richard Seal    schedule 31.08.2015
comment
Добавлено обновление с расположением элементов в дереве. Что касается списка того, что вы пробовали, именно поэтому я разместил вопрос.   -  person eat-sleep-code    schedule 31.08.2015


Ответы (2)


Если бы я был на вашем месте, я бы посмотрел на Glassmapper для Sitecore.

Это довольно легкая ORM для Sitecore.

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

Я бы также предложил переместить списки, расположенные в

sitecore > Templates > User Defined > Lists > Content 

кое-где под

sitecore > Content 

or

sitecore > System 

(в зависимости от того, что имеет больше смысла)

ОБНОВЛЕНИЕ. Попробуйте добавить это над своим классом:

[SitecoreType(AutoMap =  true)]
public class CountryItem
{
    //...
}
person Brett    schedule 01.09.2015

Если вы измените свой CountryItem и другие классы модели, чтобы наследовать от SearchResultItem следующим образом:

[PredefinedQuery("TemplateID", ComparisonType.Equal, "{ID-OF-CountryItem-TEMPLATE}", typeof(ID))]
public class CountryItem : Sitecore.ContentSearch.SearchTypes.SearchResultItem
{
    [IndexField("_displayname")]
    public virtual string DisplayName { get; set; }

    [IndexField("abbreviation")]
    public string Abbreviation { get; set; }
}

Вы должны иметь возможность использовать индексы Sitecore для получения всех стран и других списков, подобных этому:

private static string IndexName
{
    get
    {
        return string.Format("sitecore_{0}_index", (Context.ContentDatabase ?? Context.Database).Name);
    }
}

private static string Language { get { return Context.Language.Name; } }

public IEnumerable<CountryItem> GetCountries() 
{
    using (var context = ContentSearchManager.GetIndex(IndexName).CreateSearchContext())
    {
        IQueryable<CountryItem> queryable = context.GetQueryable<CountryItem>();
        queryable = queryable.Where(i => i.Language == Language);
        queryable = queryable.Where(i => i.LatestVersion);
        // ... maybe excluding standard values or some other filters
        var searchResults = queryable.GetResults();
        return queryable.ToList();
    }
}

Пожалуйста, имейте в виду, что это всего лишь пример. Вам нужно протестировать его и, скорее всего, адаптировать к вашему решению.

И, как упомянул Дар Бретт, вы не должны хранить какие-либо элементы данных в узле Templates.

person Marek Musielak    schedule 01.09.2015
comment
Переместил элементы контента и обновил вопрос выше. - person eat-sleep-code; 01.09.2015