2017-10-12 14 views
1

지난 몇 주 동안 Sitecore를 가르치려고 노력했습니다.
현재 사용자가 검색 할 수있는 래서 피 목록을 만들려고합니다.Sitecore Lucene 검색 GlassMapper가 작동하지 않음

그러나 모든 레시피에는 성분이 들어 있는데, Lucene은이 성분들을 아이템 ID가 들어있는 문자열로 반환했습니다. GlassMapper를 사용하기 위해 재료 목록을 갖고 싶었습니다.

그래서 Lucene이 필드를 찾을 수 없도록 이름을 변경하여 Lucene에서 내 코드의 성분 목록을 제외 시켰습니다. 그런 다음 GlassMapper를 설정하여 성분 목록을 채 웁니다. 그러나 목록은 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 클래스 (I에만이 방법을 편집 한)

,511,358 난 내 검색을 분할하기로 결정 잠시 동안 재생 조금 더 매핑 후 03,210

레시피 컨트롤러

[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에서 내 Recipe 모델을 사용하고 GlassMapper로 필드를 매핑하는 ViewModel을 만들었습니다.

레시피 클래스가 변경되지 않았습니다.
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); 
    } 

또 하나의 문제
내 뷰 모델이 SearchResultItem에서 손실 유용한 분야의 많은 상속하지 않기 때문에 매핑. SearchResultItem에서 필 요한 필드를 유지하기 위해 ViewModel의 BaseFields 클래스를 상속받습니다. 지금은 URL 만 필요했지만 더 많은 입력란으로 쉽게 확장 할 수 있습니다.

public class BaseFields 
{ 
    public virtual string Url { get; set; } 
}