微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

2sxc 获取实体的字段列表

如何解决2sxc 获取实体的字段列表

假设我有一个实体“Cars”,其中包含两个字段“Brand”和“Model”。

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

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

解决方法

使用 Daniel 的评论并转圈来回答您最初的问题,这里简化了,将事情分开一点以查看部分:

@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"]
,

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

特别看看LINQ的例子;数字 6、7 和 8。

,

我@Joao

基本上,您应该查看 Jeremys 对大部分问题的回答。

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

每个实体都有一个名为 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

所以使用它你可以找到你想要的一切 - 但正如你所看到的,这是一个相当大的跳跃。

,

这是一个简单的工作示例。我有点希望 Daniel 插话并揭示一种从 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 个字段的汽车内容类型 enter image description here

View 的输出是这样的 enter image description here

,

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。