2014-02-14 24 views
1

我已经设置了两个动态内容模块,并成功在后端链接到另一个。我遇到的问题是我试图从另一个查询一个值。该示例如下:使用Sitefinity查询相关的动态内容模块

模块一: 业务领域 - >业务部

模块二: 服务

所以业务部门都有相关服务的Guid的数组。我创建了一个Widget,您可以点击该服务并加载服务信息,但现在我想显示服务中的所有业务单元。我必须这样做,因为我将显示所有单位在一个区域以及怀疑他们可能有一个单位在多个服务领域知道用户喜欢如何改变东西:)

所以有没有关于如何检索这些的建议?我以为我会从Page Guid开始,但我真正想要的是传递给页面的服务Guid,然后使用它来运行Linq查询。我已经走到这一步,抛出的错误:这是一个从

var pManager = Telerik.Sitefinity.Modules.Pages.PageManager.GetManager(); 
Telerik.Sitefinity.Pages.Model.PageData page = pManager.GetPageData(new Guid(currentNode.Key)); 

if (page != null) 
{ 
    var serviceGuid = new Guid(SiteMapBase.GetCurrentProvider().CurrentNode.Key); 

    var list = new List<Guid>(); 
    list.Add(serviceGuid); 
    Guid[] guidList = list.ToArray(); 

    DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(providerName); 
    Type serviceType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.Services.Service"); 
    Type businessUnitType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.BusinessAreas.BusinessUnit"); 

    myFilteredCollection = dynamicModuleManager.GetDataItems(businessUnitType) 
               .Where(i => i.Status == Telerik.Sitefinity.GenericContent.Model.ContentLifecycleStatus.Live && i.Visible == true) 
               .Where(d => d.GetValue<TrackedList<Guid>>("Service").Contains(guidList)) 
               .OrderBy(i => i.GetValue<System.Decimal>("SortOrder"));     
    } 

产生很想任何提示到哪里我应该寻找

Database mapped field uses different type 'System.Guid[]'. 
Parameter name: methodCallExpression 
Actual value was re-d.FieldValue("Service"). 

。我觉得我已经不断阅读相同的五个帖子和博客。

回答

2

我已经在模块构建器中创建了业务单元模块,将业务单元作为子类型。我还在模块构建器中创建了一个服务模块,并为它创建了一个动态项目字段控件选择器。在业务单元模块上,我添加了一个Guid []字段,并使用服务选择器来关联服务。

我在Sitefinity中设置了几个页面,其上有一个Services列表小部件,另一个页面上有一个Services细节小部件,列表指向详细信息页面。在服务详细信息窗口小部件模板上,我包含一个自定义控件,它使用以下代码通过url名称查找服务,然后查找业务单元并检查它们是否与服务关联。

protected void Page_Load(object sender, EventArgs e) 
{ 
    RouteHelper.SetUrlParametersResolved(); 

    string urlParams = this.GetUrlParameterString(true); 

    if (!string.IsNullOrEmpty(urlParams)) 
    { 
     urlParams = urlParams.Replace("/", string.Empty); 


     var dynamicModuleManager = DynamicModuleManager.GetManager(string.Empty); 
     var serviceType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.Services.Service"); 
     var service = dynamicModuleManager.GetDataItems(serviceType).FirstOrDefault(s => s.Status == ContentLifecycleStatus.Live && s.UrlName == urlParams); 

     if (service != null) 
     { 
      var businessUnits = GetBusinessUnits().Where(bu => bu.GetValue<Guid[]>("Services").Contains(service.OriginalContentId)); 

      foreach (var bu in businessUnits) 
      { 
       //do something cool 
      } 
     } 
    } 
} 

public IQueryable<DynamicContent>GetBusinessUnits() 
{ 
    var providerName = String.Empty; 
    DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(providerName); 
    Type businessUnitType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.BusinessAreas.BusinessUnit"); 

    var myCollection = dynamicModuleManager.GetDataItems(businessUnitType).Where(bu => bu.Status == ContentLifecycleStatus.Live); 

    return myCollection; 
} 
+0

谢谢!我已经想通了,并计划今天发布它,但你的比我迄今为止更优雅! – BigGeorge

+0

没问题,乐于帮忙! – Ben