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
假设我有一个包含两个字段“品牌”和“型号”的实体“汽车”。
在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