【问题标题】:Querying Related Dynamic Content Modules with Sitefinity使用 Sitefinity 查询相关动态内容模块
【发布时间】:2014-02-15 01:39:02
【问题描述】:

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

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

模块二: 服务

所以业务部门有一系列与服务相关的 Guid。我创建了一个小部件,您可以在其中单击服务,它会加载服务信息,但现在我想显示服务中的所有业务单位。我不得不这样做,因为我还将显示一个区域中的所有单元,并怀疑他们可能在多个服务区域中有一个单元,知道用户喜欢如何改变事物:)

那么对于如何检索这些有什么建议吗?我以为我会从页面 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"));                
    }

很想知道我应该去哪里找任何提示。我觉得我已经达到了连续阅读相同的五个帖子和博客的目的。

【问题讨论】:

    标签: c# asp.net linq sitefinity


    【解决方案1】:

    我在模块构建器中创建了一个业务领域模块,其中业务单位作为子类型。我还在模块构建器中创建了一个服务模块,并为它创建了一个动态项目字段控制选择器。在业务单元模块上,我添加了一个 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;
    }
    

    【讨论】:

    • 谢谢!我已经想通了,并计划今天发布,但你的比我迄今为止的更优雅!
    • 没问题,很高兴为您提供帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多