使用Sitefinity查询相关的动态内容模块

时间:2014-02-14 13:52:05

标签: c# asp.net linq sitefinity

我已经设置了两个动态内容模块,并在后端成功地将其中一个链接到另一个。我遇到的问题是我试图查询另一个的值。示例如下:

第一单元: 业务范围 - >业务部门

第二单元: 服务

因此,业务部门有一个与服务相关的Guid数组。我已经创建了一个Widget,您可以在其中单击该服务,它将加载服务信息,但现在我想显示该服务中的所有业务单位。我必须这样做,因为我将在一个区域中显示所有单位,并怀疑他们可能在多个服务区域中有一个单位知道用户如何改变事物:)

那么我有什么建议可以检索这些吗?我想我会从Page Guid开始,但我真正想要的是传递给页面的服务的Guid,然后能够使用它运行Linq查询。到目前为止我得到的错误是:

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

生成
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"));                
    }

我会喜欢任何关于我应该在哪里寻找的提示。我觉得我已经不断阅读相同的五篇帖子和博客了。

1 个答案:

答案 0 :(得分:2)

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

我在Sitefinity中设置了几个页面,一个页面上有一个服务列表小部件,另一个页面上有一个服务详细信息小部件,列表指向详细信息页面。在服务详细信息小部件模板上,我包含一个自定义控件,它使用以下代码通过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;
}