基于多个内容选择器过滤器获取内容节点umbraco 7

基于多个内容选择器过滤器获取内容节点umbraco 7,umbraco,umbraco7,Umbraco,Umbraco7,我有一个名为Career Item的文档类型,其中包含一些属性和2个内容选择器。一个是选择一种职业:如司机,另一个是选择一个分支机构的职业将放置:如根特比利时 我的职业类型和分支机构位于一个单独的内容存储库中,这意味着它们没有模板,只是一个具有可在多个内容页上使用的属性的文档 我为此创建了2个过滤器,通过一些jQuery,我成功地根据选择设置url,以获得如下url: http://localhost:59733/nl/vacatures/?f=1075&f=1076&b=108

我有一个名为
Career Item
的文档类型,其中包含一些属性和2个内容选择器。一个是选择一种职业:如司机,另一个是选择一个分支机构的职业将放置:如根特比利时

我的职业类型和分支机构位于一个单独的
内容存储库中,这意味着它们没有模板,只是一个具有可在多个内容页上使用的属性的文档

我为此创建了2个过滤器,通过一些jQuery,我成功地根据选择设置url,以获得如下url:

http://localhost:59733/nl/vacatures/?f=1075&f=1076&b=1085&b=1082
这里有
f
包含
Career type
Id,还有
b
包含
Branch
Id

现在在我的razor中,我正在根据选择对内容节点进行过滤,但它相当混乱

// Collect values for branch and function from the url querystring to perform filtering
var branch = umbraco.library.RequestQueryString("b"); // eg: 1085,1082 from example url above
var function = umbraco.library.RequestQueryString("f"); // eg: 1075,1076 from example url above

// Take the careers list content node
var careersList = Umbraco.TypedContentAtRoot().DescendantsOrSelf("CareersList").FirstOrDefault();
var careerItems = careersList.Children.Where("Visible");

string query = "";
string funcQuery = "";
string branchQuery = "";

// Filter on fuction
if (!String.IsNullOrEmpty(function))
{
    // Property alias function: content picker
    string[] functions = function.Split(',');
    foreach (string func in functions)
    {
        if (!String.IsNullOrEmpty(funcQuery))
        {
               funcQuery += " || function == \"" + func + "\"";
        }
        else
        {
               funcQuery = "function == \"" + func + "\"";
        }
    }
 }

  // Filter on branch
  if (!String.IsNullOrEmpty(branch))
  {
       // Property alias branch: content picker
       string[] branches = branch.Split(',');
       foreach (string br in branches)
       {
             if (!String.IsNullOrEmpty(branchQuery))
             {
                  branchQuery += " || branch == \"" + br + "\"";
             }
             else
             {
                  branchQuery = "branch == \"" + br + "\"";
             }
       }
 }

 funcQuery = !String.IsNullOrEmpty(funcQuery) ? "(" + funcQuery + ")" : "";
 branchQuery = !String.IsNullOrEmpty(branchQuery) ? "(" + branchQuery + ")" : "";

 query = funcQuery + (!String.IsNullOrEmpty(branchQuery) ? " && " + branchQuery : "");

 if (!String.IsNullOrEmpty(query))
 {
     careerItems = careerItems.Where(query);
 }
我是否遗漏了一些东西,这可以简化吗?因为现在它只有2个过滤器,但如果我有5或6个过滤器,那么这是不可行的


/Michael

您可以使用以下内容:

var branch = "1085,1082";
var function = "1075,1076";

var careerTypes =
    careersList
        .Where(c => c.IsVisible() 
                    &&
                    branch.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                          .Select(i => int.Parse(i))
                          .Contains(c.GetPropertyValue<int>("branchId"))
                    &&
                    branch.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                          .Select(b => int.Parse(b))
                          .Contains(c.GetPropertyValue<int>("functionId"))
              );

//branchId and functionId are the property names of those 2 content pickers
var branch=“10851082”;
var function=“10751076”;
var-careerTypes=
护理人员名单
.Where(c=>c.IsVisible()
&&
Split(新[]{',},StringSplitOptions.RemoveEmptyEntries)
.Select(i=>int.Parse(i))
.Contains(c.GetPropertyValue(“branchId”))
&&
Split(新[]{',},StringSplitOptions.RemoveEmptyEntries)
.Select(b=>int.Parse(b))
.Contains(c.GetPropertyValue(“functionId”))
);
//branchId和functionId是这两个内容选择器的属性名

我也可以考虑把它放在iPusiSee内容的扩展方法中,称为检查过滤器,它接受数组作为参数,这样你就可以做一些类似的事情:

var branches = Request.QueryString("b").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var functions= Request.QueryString("f").Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

var careerTypes = careersList.Where(a => a.IsVisible() && a.CheckFilters(branches, functions));
您可以在扩展方法中拥有所有逻辑,然后很容易添加额外的过滤器,因为您只需修改扩展方法或添加ne重载

您也不需要使用umbraco.library.RequestQueryString,因为它只是Request.QueryString函数的包装器

下面是一个非常粗略的扩展方法示例:

public static bool CheckFilters(this IPublishedContent content, string[] branches, string[] functions)
{
    return branches.Contains(content.GetPropertyValue<string>("branchPropertyAlias", "")) && functions.Contains(content.GetPropertyValue<string>("functionPropertyAlias", ""));
}
public static bool CheckFilters(此IPPublishedContent内容、字符串[]分支、字符串[]函数)
{
返回branchs.Contains(content.GetPropertyValue(“branchPropertyAlias”)和&functions.Contains(content.GetPropertyValue(“functionPropertyAlias”);
}

这是一个非常简单的示例,假设内容项只有一个分支和一个函数。

我需要在哪里添加此扩展方法?可以在App_代码中添加,也可以在站点的DLL中添加,如果您在中有自定义函数等。你知道如何用c#编写扩展方法吗?我以前做过,我需要重新编写,但我会试一试。如果我被卡住了,我会给你回电话的。提前谢谢你,你能举个例子吗?我已经创建了一个静态类,但是现在我需要创建一个静态方法来处理这个问题。另外,是否可以只允许将此扩展方法扩展到特定的节点别名?与本例中的“CareerList”类似,将扩展方法限制为某些节点类型是不可能的,因为无论属性如何,扩展都应用于对象。但是,您可以向扩展方法添加一些逻辑,这样,如果您尝试在错误的节点类型或simlar上调用它,它就会抛出错误。