2017-10-12 12 views
1

私は過去数週間、Sitecoreを自分自身で教えようとしています。
現在、ユーザーが検索するためのレシピのリストを作成しようとしています。Sitecore Lucene検索GlassMapperが動作しない

しかし、すべてのレシピには成分が含まれていますが、Luceneはこれらの成分をアイテムIDを含む文字列として返しました。 GlassMapperにショットを与えたので、私のコードにList of Ingredientsを載せたいと思っていました。

私は、Luceneがフィールドを見つけることができないように名前を変更することで、自分のコードのIngredientリストをLuceneから除外しました。 次にGlassMapperを設定してIngredientリストに入力します。しかし、リストはnullのままです。

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クラス(私はこの方法だけを編集した)

私は私の検索を分割することを決めしばらく遊んともう少しをマッピングした後、

レシピコントローラー

[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でフィールドをマップしました。

レシピクラスは変更されませんでした。
Ingredientクラスは変更されませんでした。
GlassMapperScCustomクラスは不要で、デフォルトに戻しました。

RecipeViewModelクラスは、このクラスにマッピングした後成分表は食材しかし、そのすべてのフィールドはnullの正確な量を持っていました。 もう少しインターネットを見て、私はこのstackoverflowポストを見つけました: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; } 
} 
関連する問題