问题描述
假设我有一个实体“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>
,
为了更新我需要实现的目标,这会输出字段名称和标签以进行简单循环:
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