C# GlassMapper不工作的Sitecore Lucene搜索

C# GlassMapper不工作的Sitecore Lucene搜索,c#,sitecore,sitecore8,glass-mapper,C#,Sitecore,Sitecore8,Glass Mapper,过去几周,我一直在努力自学Sitecore。 目前,我正在尝试创建一个供用户搜索的食谱列表 然而,每个配方都包含配料,Lucene将这些配料作为包含项目ID的字符串返回。我想在我的代码中有一个成分列表,所以我给了GlassMapper一个机会 因此,我通过更改名称将代码中的成分列表从Lucene中排除,以便Lucene无法找到该字段。 然后我设置GlassMapper来填充配料表。但是,列表保持为空 如何让GlassMapper为我填写此列表 我的代码: 配方类 GlassMapperScCus

过去几周,我一直在努力自学Sitecore。
目前,我正在尝试创建一个供用户搜索的食谱列表

然而,每个配方都包含配料,Lucene将这些配料作为包含项目ID的字符串返回。我想在我的代码中有一个成分列表,所以我给了GlassMapper一个机会

因此,我通过更改名称将代码中的成分列表从Lucene中排除,以便Lucene无法找到该字段。 然后我设置GlassMapper来填充配料表。但是,列表保持为空

如何让GlassMapper为我填写此列表

我的代码:
配方类

GlassMapperScCustom类(我只编辑过这个方法)

publicstaticiconfigurationloader[]GlassLoaders()
{
var attributes=新SitecoreAttributeConfigurationLoader(“Receptenboek”);
var loader=new SitecoreFluentConfigurationLoader();
var config=loader.Add();
config.Id(x=>x.ItemId);
config.Info(x=>x.Language).InfoType(SitecoreInfoType.Language);
config.Info(x=>x.Version).InfoType(SitecoreInfoType.Version);
配置字段(x=>x.\u);
config.Info(x=>x.Uri).InfoType(SitecoreInfoType.Url);
返回新的IConfigurationLoader[]{attributes,loader};
}
配方控制器

[HttpGet]
公共行动结果索引()
{
列出食谱;
可查询查询;
string index=string.Format(“sitecore{0}\u index”,sitecore.Context.Database.Name);
var sitecoreService=newsitecoreservice(Sitecore.Context.Database.Name);
string search=WebUtil.GetQueryString(“search”);
使用(var context=ContentSearchManager.GetIndex(index.CreateSearchContext())
{
如果(!string.IsNullOrEmpty(搜索))
{
query=context.GetQueryable()。其中(p=>p.Path.Contains(“/sitecore/Content/Home/Recipes/”)。其中(p=>p.TemplateName==“Recipe”)。其中(p=>p.RecipeName.Contains(search));
}
其他的
{
搜索“”;
query=context.GetQueryable()。其中(p=>p.Path.Contains(“/sitecore/Content/Home/Recipes/”)。其中(p=>p.TemplateName==“Recipe”);
}
recipes=query.ToList();
foreach(配方中的变量r)
{
sitecoreService.Map(r);
Sitecore.Diagnostics.Log.Audit(“SWELF”+r.RecipeName+“-”+r.BookName+“-”+r.AmountOfPeople+“-”+r.Name+“-”+r.U.Count(),this);
}
}
RecipesViewModel bvm=new RecipesViewModel(){Recipes=Recipes,Search=Search};
返回视图(bvm);
}

在玩了一段时间后,我决定将搜索和映射再拆分一点。我在Lucene中使用了我的配方模型,并创建了一个ViewModel,用GlassMapper将字段映射到

配方类没有更改。
成分类别没有改变。
GlassMapperScCustom类是不需要的,所以我恢复了它的默认值

RecipeView模型类
映射到此类后,配料列表的配料量正确,但其所有字段都为null。 在网上多看了一会儿后,我发现了这篇stackoverflow帖子:
我决定尝试一下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; }
}

在玩了一段时间之后,我决定将我的搜索和映射再拆分一点。我在Lucene中使用了我的配方模型,并创建了一个ViewModel,用GlassMapper将字段映射到

配方类没有更改。
成分类别没有改变。
GlassMapperScCustom类是不需要的,所以我恢复了它的默认值

RecipeView模型类
映射到此类后,配料列表的配料量正确,但其所有字段都为null。 在网上多看了一会儿后,我发现了这篇stackoverflow帖子:
我决定尝试一下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; }
}

也许值得你去问?也许值得你去问?
    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);
    }
[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");

        //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);
    }
public class BaseFields
{
    public virtual string Url { get; set; }
}