从控制器中的模型访问数据?
Access data from Model in Controller?
我有一个显示最新文章列表的模型,我希望能够定义显示多少篇文章。我创建了一个名为 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;
}
}
}
对于新手问题,我深表歉意,但我尝试过的所有方法到目前为止都没有奏效。我以为我可以使用 .Take(LastArticlesTeaserBlock.DisplayNumberOfPressArticles);
访问模型
您的 SearchClient
class 看起来像 自定义 实现,很难判断是否存在错误。
选项 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)
如何将您的签名更改为 GetArticlePages(int maxCount)
之类的东西,然后在您的 Index
方法中像 ArticlePages = GetArticlePages(currentContent.DisplayNumberOfPressArticles)
一样调用它?
我有一个显示最新文章列表的模型,我希望能够定义显示多少篇文章。我创建了一个名为 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;
}
}
}
对于新手问题,我深表歉意,但我尝试过的所有方法到目前为止都没有奏效。我以为我可以使用 .Take(LastArticlesTeaserBlock.DisplayNumberOfPressArticles);
您的 SearchClient
class 看起来像 自定义 实现,很难判断是否存在错误。
选项 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)
如何将您的签名更改为 GetArticlePages(int maxCount)
之类的东西,然后在您的 Index
方法中像 ArticlePages = GetArticlePages(currentContent.DisplayNumberOfPressArticles)
一样调用它?