项目名称为字段而不是属性?

时间:2014-08-22 20:06:55

标签: sitecore sitecore6

有没有办法获取Item的属性,就好像它是一个字段?我有一堆代码尝试在UserControls中推广Item行为...并获取用作字段名称的属性。例如,我有一个通用的DropDownList控件,它接受两个字符串,一个用于DataTextField,另一个用于DataValueField。但是当我想将项目NAME用作值时,这会崩溃:

string DataValueField = "SomeField";
string DataTextField = "Name";

ListItem x = new ListItem(myItem[DataTextField], myItem[DataValueField]);  //OOOPS!

连连呢?除了编写真正的hacky代码,专门检查" Name"?因为我已经把它覆盖了。

3 个答案:

答案 0 :(得分:1)

我认为如果没有反映,你可以轻易地访问它,正如你所说的那样,即使那样它也可能不那么干净。

我很想写一个简单的扩展方法来处理Fields集合中不可用的Sitecore属性:

public static string GetField(this Item item, string fieldName)
{
    switch (fieldName)
    {
        case "Name":
            return item.Name;
        case "DisplayName":
            return item.DisplayName;
        default:
            return item[fieldName];
    }
}

然后是一个简单的例子:

string DataValueField = "SomeField";
string DataTextField = "Name";

ListItem x = new ListItem(myItem.GetField(DataTextField), myItem.GetField(DataValueField));

答案 1 :(得分:1)

你实际上可以(或者可以使用早期版本的Sitecore)!

我写了一篇关于如何获得特殊领域的blog post'几年前的价值观。

TL; DR

支持的特殊字段'是:

@id = Item.ID.ToString()
@key = Item.Key
@lang = Item.Language.ToString()
@mid = Item.BranchID.ToString()
@name = Item.Name
@tid = Item.TemplateID.ToString()
@ver = Item.Version.ToString()

示例:

Sitecore.Data.Items.Item item = Sitecore.Context.Database.GetItem("/sitecore/content");

string id = item["@id"];
string key = item["@key"];
string lang = item["@lang"];
string mid = item["@mid"];
string name = item["@name"];
string tid = item["@tid"];
string ver = item["@ver"];

Sitecore.Diagnostics.Assert.IsTrue(id == item.ID.ToString(), "No match");
Sitecore.Diagnostics.Assert.IsTrue(key == item.Key.ToString(), "No match");
Sitecore.Diagnostics.Assert.IsTrue(lang == item.Language.ToString(), "No match");
Sitecore.Diagnostics.Assert.IsTrue(mid == item.BranchId.ToString(), "No match");
Sitecore.Diagnostics.Assert.IsTrue(name == item.Name.ToString(), "No match");
Sitecore.Diagnostics.Assert.IsTrue(tid == item.TemplateID.ToString(), "No match");
Sitecore.Diagnostics.Assert.IsTrue(ver == item.Version.ToString(), "No match");

答案 2 :(得分:0)

绝对不能。您将不得不编写像jammykam建议的代码。 看一下数据库,您会看到Name是Items表中的一列,而Fields表中没有任何条目。

enter image description here

在此示例中,您会看到“显示名称”是一个字段。

欢呼声