2017-10-12 122 views
1

我一直在尝试自学Sitecore过去几个星期。
目前我正在尝试创建一个供用户搜索的食谱列表。Sitecore Lucene搜索与GlassMapper无法正常工作

但是每个食谱都含有成分,Lucene将这些成分作为包含商品ID的字符串返回。我想在我的代码中添加成分列表,所以我给了GlassMapper一个镜头。

因此,我通过更改名称来排除Lucene中我的代码中的成分列表,所以Lucene找不到该字段。 然后我设置GlassMapper来填充成分列表。但列表保持空。

如何让GlassMapper为我填充此列表?

我的代码:
食谱类

[SitecoreType(TemplateId= "{1CF86642-6EC5-4B26-B8A7-1B2EC41F7783}")] 
public class Recipe : SearchResultItem 
{ 
    [SitecoreId] 
    public Guid Id { get { return base.ItemId.Guid; } } 
    public virtual string RecipeName { get; set; } 
    public virtual string BookName { get; set; } 
    public virtual IEnumerable<Ingredient> _Ingredients { get; set; } 
    public virtual int AmountOfPeople { get; set; } 
} 

成份类

[SitecoreType(TemplateId = "{730A0D54-A697-4DAA-908A-279CD24A9F41}")] 
public class Ingredient : SearchResultItem 
{ 
    [SitecoreId] 
    Guid Id { get; } 
    [IndexField("Name")] 
    public virtual string IngredientName { get; set; } 
} 

GlassMapperScCustom类(我只修改此方法)

public static IConfigurationLoader[] GlassLoaders() 
    { 
     var attributes = new SitecoreAttributeConfigurationLoader("Receptenboek"); 

     var loader = new SitecoreFluentConfigurationLoader(); 
     var config = loader.Add<Recipe>(); 


     config.Id(x => x.ItemId); 
     config.Info(x => x.Language).InfoType(SitecoreInfoType.Language); 
     config.Info(x => x.Version).InfoType(SitecoreInfoType.Version); 

     config.Field(x => x._Ingredients); 
     config.Info(x => x.Uri).InfoType(SitecoreInfoType.Url); 
     return new IConfigurationLoader[] {attributes, loader }; 

    } 

规则控制器

[HttpGet] 
    public ActionResult Index() 
    { 
     List<Recipe> recipes; 
     IQueryable<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)); 
      } 
      else 
      { 
       search = ""; 
       query = context.GetQueryable<Recipe>().Where(p => p.Path.Contains("/sitecore/Content/Home/Recipes/")).Where(p => p.TemplateName == "Recipe"); 
      } 
      recipes = query.ToList(); 
      foreach(var r in recipes) 
      { 
       sitecoreService.Map(r); 
       Sitecore.Diagnostics.Log.Audit("SWELF" + r.RecipeName + "- " + r.BookName + " - " + r.AmountOfPeople + " - " + r.Name + "--" + r._Ingredients.Count(), this); 

      } 
     } 
     RecipesViewModel bvm = new RecipesViewModel() { Recipes = recipes, Search = search }; 
     return View(bvm); 
    } 
+0

可能值得通过https://sitecore.stackexchange.com/询问? – DaveParsons

回答

0

玩弄了一会儿,我决定我的拆分搜索和地图多一点之后。我在Lucene中使用了食谱模型,并创建了一个ViewModel来将这些字段映射到GlassMapper。

食谱类没有改变。
成分类没有变化。
GlassMapperScCustom类不是必需的,所以我恢复了它的默认值。

RecipeViewModel类
映射到这个类后配料表成分过但是它的所有领域,其中空的正确的金额。 环顾四周,在互联网上多了一些我发现这个计算器贴:Why isn't my Enumerable getting populated by Glass.Mapper?
我决定给SitecoreFieldType一个去,它做了诡计!

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

规则控制器
它竟然是映射错误的方式aswel。我发现了一个列表的例子被映射到使用SitecoreService.GetItem <另一个列表>()

[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"); 

     //Search with Lucene 
     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(); 
      } 
     } 
     //Map to ViewModel 
     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; } 
}