2sxc 获取实体的字段列表

2sxc Get list of fields of an entity

假设我有一个包含两个字段“品牌”和“型号”的实体“汽车”。

在c#模板中,是否可以将“Cars”中的字段名称动态获取到列表中?输出应该是 {"Brand", "Model"}。

更进一步,是否可以获取字段名称和描述的描述和具体翻译?

我认为教程中很好地涵盖了您要尝试做的事情。 https://2sxc.org/dnn-tutorials/en/razor

特别是看一下 LINQ 示例;数字 6、7 和 8。

我@Joao

基本上你应该检查 Jeremys 对你问题的大部分回答。

我相信您也在询问如何使用 ContentType 规范中的字段标签在 Razor 中显示像 Brand 这样的标签。这是可能的,但它有点难,因为它不是一个常见的用例。因此,让我为您指出正确的方向...

每个实体都有一个名为 Type 的 属性。在 Razor 中,您可以使用

var someType = AsEntity(yourThing).Type;

这是一个 IContentType https://docs.2sxc.org/api/dot-net/ToSic.Eav.Data.IContentType.html

要获取属性及其名称,您可以转到

var attr = someType.Attributes["TheName"];

这给你一个 IContentTypeAttribute https://docs.2sxc.org/api/dot-net/ToSic.Eav.Data.IContentTypeAttribute.html

这有 Metadata - 所以

var attr = someType.Attributes["TheName"].Metadata;

元数据是 IMetadataOf https://docs.2sxc.org/api/dot-net/ToSic.Eav.Metadata.IMetadataOf.html

所以使用它你可以找到你想要的一切 - 但正如你所看到的那样,这是一个很难跳过的圈子。

这是一个简单的工作示例。我有点希望丹尼尔插话并揭示一种从 myType.Attributes 直接转换为 Json 字符串的简单方法??

创建一个新视图,启用列表,将其指向您的汽车内容类型,修复最后几行,以便“和数据...”部分与您的 CT 的实际字段相匹配。

@inherits ToSic.Sxc.Dnn.RazorComponent

@{
    var myData = AsList(Data);
    var myType = AsEntity(myData.First()).Type;
    var myFields = new List<string>();
    foreach(var field in myType.Attributes) {
        myFields.Add(field.Name);
    }
}
<div @Edit.TagToolbar(Content)>
    <h3>View Heading</h3>
    <h4>Table (Content Type) Name: @myType.Name</h4>
    <p>has the following fields</p>
    <div class="d-flex flex-row bd-highlight mb-3">
@foreach(var field in myType.Attributes) {
        <p class="p-2 bd-highlight"><strong>@field.Name</strong></p>
}
    </div>

    <h4>As a comma separated list?</h4>
    <p>@string.Format("{{\"{0}\"}}", string.Join("\",\"", myFields))</p>

    <h4>And the data...</h4>
@foreach(var cont in AsList(Data)) {

    <div class="d-flex flex-row bd-highlight mb-3"
        @Edit.TagToolbar(cont)>
        <div class="p-2 bd-highlight">@cont.EntityId</div>
        <div class="p-2 bd-highlight">@cont.Name</div>
        <div class="p-2 bd-highlight">@cont.Brand</div>
        <div class="p-2 bd-highlight">@cont.Model</div>
    </div>
}
</div>

只有 3 个字段的汽车内容类型

视图的输出如下所示

利用大牛的评论,绕圈子来回答你原来的问题,这里简化了一些,把事情分成了几个部分:

@inherits ToSic.Sxc.Dnn.RazorComponent
@using Newtonsoft.Json

@{
    var myData = AsList(Data);
    var myDatum = AsEntity(myData.First());
    var myFieldNames = (myDatum.Type.Attributes as IEnumerable<dynamic>).Select(a => a.Name);

}
<pre>
myDatum.Type.Name = @myDatum.Type.Name
myFieldNames = @JsonConvert.SerializeObject(myFieldNames)
</pre>

然后只输出:

myDatum.Type.Name = Cars
myFieldNames = ["Name","Brand","Model"]

为了更新我需要实现的目标,这输出了一个简单循环的字段名称和标签:

var myData = AsList(App.Data["Stages"]);
var myDatum = AsEntity(myData.First());
var myFields = (myDatum.Type.Attributes as IEnumerable<dynamic>);
// var myFieldNames = myFields.Select(a => a.Name);
// var myFieldLabels = myFields.Select(a => (a.Metadata as IEnumerable<dynamic>).First().Title.TypedContents);
var myFieldNamesAndLabels = myFields.Select(i => new 
{ 
  i.Name, 
  (i.Metadata as IEnumerable<dynamic>).First().GetBestTitle()
});

如果有更简单的方法来实现这一点,请告诉我。 感谢@Jeremy Farrance 和@iJungleBoy