在玩了一段时间之后,我决定将我的搜索和映射再拆分一点。我将我的配方模型用于Lucene,并创建了一个ViewModel,用GlassMapper将字段映射到。
配方类没有更改。
成分类别没有改变。
RecipeViewModel类
映射到此类后,成分列表具有正确的成分量,但其所有字段均为null。
在网上浏览了一下之后,我发现了这篇文章:
Why isn't my Enumerable getting populated by Glass.Mapper?
[SitecoreType(TemplateId = "{1CF86642-6EC5-4B26-B8A7-1B2EC41F7783}", AutoMap = true)]
public class RecipeViewModel : BaseFields
{
[SitecoreId]
public ID Id { get; set; }
public virtual string RecipeName { get; set; }
public virtual string BookName { get; set; }
[SitecoreField(FieldId = "{D1603482-7CBC-4E55-9CCB-E51DC0FC5A0B}", FieldType = SitecoreFieldType.Multilist)]
public virtual IEnumerable<IngredientViewModel> Ingredients { get; set; }
public virtual int AmountOfPeople { get; set; }
}
配方控制器
[HttpGet]
public ActionResult Index()
{
List<RecipeViewModel> recipes;
List<Recipe> query;
string index = string.Format("sitecore_{0}_index", Sitecore.Context.Database.Name);
var sitecoreService = new SitecoreService(Sitecore.Context.Database.Name);
string search = WebUtil.GetQueryString("search");
using (var context = ContentSearchManager.GetIndex(index).CreateSearchContext())
{
if (!string.IsNullOrEmpty(search))
{
query = context.GetQueryable<Recipe>().Where(p => p.Path.Contains("/sitecore/Content/Home/Recipes/")).Where(p => p.TemplateName == "Recipe").Where(p => p.RecipeName.Contains(search)).ToList();
}
else
{
search = "";
query = context.GetQueryable<Recipe>().Where(p => p.Path.Contains("/sitecore/Content/Home/Recipes/")).Where(p => p.TemplateName == "Recipe").ToList();
}
}
recipes = query.Select(x => sitecoreService.GetItem<RecipeViewModel>(x.ItemId.Guid)).ToList();
RecipesViewModel bvm = new RecipesViewModel() { Recipes = recipes, Search = search };
return View(bvm);
}
还有一个问题
因为我的ViewModel没有从SearchResultItem继承很多有用的字段,这些字段在映射中丢失了。为了保留SearchResultItem中所需的字段,我为ViewModel创建了一个BaseFields类来继承。我现在只需要Url,但可以用更多字段轻松扩展。
public class BaseFields
{
public virtual string Url { get; set; }
}