Доступ к данным из модели в контроллере? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть модель для отображения списка последних статей, и я хотел бы иметь возможность определить, сколько статей отображается. Я создал свойство с именем DisplayNumberOfPressArticles и хотел бы получить доступ к значению этого свойства из моего контроллера.

Вот модель:

using Site.Helpers.Selections;
using Site.Models.Blocks.Data;
using EPiServer.DataAnnotations;
using EPiServer.Shell.ObjectEditing;
using System.ComponentModel.DataAnnotations;

namespace Site.Models.Blocks
{
    [SiteContentType(GUID = "884202C2-61F1-4DF5-85A7-DC3D4E493F59")]
    [SiteImageUrl]
    public class LastArticlesTeaserBlock : SiteBlockData, PressOverviewData, ISpaceableData
    {
        [CultureSpecific]
        public virtual string Heading { get; set; }

        [Range(1, 1000)]
        public virtual int DisplayNumberOfPressArticles { get; set; }

    }
}

В моем контроллере Я хотел бы принять значение DisplayNumberOfPressArticles в качестве ограничения для запроса .Take ():

using System;
using System.Collections.Generic;
using Site.Models.Blocks;
using EPiServer.Web.Mvc;
using System.Web.Mvc;
using Site.Models.Pages;
using Site.Models.ViewModels;
using EPiServer.Find;
using EPiServer.Find.Api;
using EPiServer.Find.Cms;
using EPiServer.Find.Framework;
using EPiServer.Logging;
using ILogger = EPiServer.Logging.ILogger;
using EPiServer.Globalization;

namespace Site.Controllers
{
    public class LastArticlesTeaserBlockController : BlockController<LastArticlesTeaserBlock>
    {
        private static readonly ILogger Logger = LogManager.GetLogger();
        public override ActionResult Index(LastArticlesTeaserBlock currentContent)
        {
            var model = new LastArticlesTeaserViewModel
            {
                Headline = currentContent.Heading,
                ArticlePages = GetArticlePages(),
                PaddingTop = currentContent.PaddingTop,
                PaddingBottom = currentContent.PaddingBottom
            };

            return PartialView(model);
        }

        private List<PressDetailsPage> GetArticlePages()
        {
            List<PressDetailsPage> result = new List<PressDetailsPage>();

            IClient findClient = SearchClient.Instance;
            var search = findClient.Search<PressDetailsPage>();

            search = search
                .Filter(sp => sp.IsDeleted.Match(false)).PublishedInCurrentLanguage()
                .Filter(sp => sp.Headline.Exists() | sp.Description.Exists())
                .Filter(sp => sp.Language.Name.Match(ContentLanguage.PreferredCulture.Name))
                .OrderByDescending(sp => sp.PublishDate, SortMissing.Last)
                .Take(??);

            try
            {
                var searchResult = search.GetContentResult();

                result.AddRange(searchResult);
            }
            catch (NullReferenceException e)
            {
                Logger.Error(e.ToString());
            }

            return result;

        }
    }
}

Извините за вопрос newb ie, но все, что я пробовал, не сработало уже. Я думал, что смогу получить доступ к модели, используя .Take(LastArticlesTeaserBlock.DisplayNumberOfPressArticles);

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Как насчет изменения вашей подписи на что-то вроде GetArticlePages(int maxCount) и последующего ее вызова как ArticlePages = GetArticlePages(currentContent.DisplayNumberOfPressArticles) в вашем Index методе?

0 голосов
/ 05 апреля 2020

Ваш класс SearchClient выглядит как пользовательская реализация и трудно сказать, есть ли ошибка.

Вариант 1: Что-то вроде - db.ArticleSet.OrderByDescending(t => t.Articles.Count).Take(10);


Вариант 2: Или более прямой запрос.

Облегчите жизнь и разбейте ее на две части Выполните запрос, выполните его, а затем соедините, если хотите.

Шаг 1

var articlesQuery = from x in Articles..
                  where x.IsDeleted == true ....

Шаг 2

var limitedArticlesQuery  = articlesQuery.Take(25);

От размера клиента отправьте int pageSize

var pagedProductQuery = articlesQuery.Skip(10 * pageSize).Take(10)
...