如何只输出 select 的文本而不是 2sxc razor 模板中的值?

How can I output just the text of a select instead of the value in 2sxc razor templates?

在 2sxc App 中,在我的内容类型中,我有一个加拿大省份的下拉列表,其中包含一个名称和一个缩写值。它看起来像这样:

英国人Columbia:bc Alberta:ab 太子 Island:pei

等等

我希望能够在我的 c# razor 模板中使用文本标签和 select 值。当我使用 @Content.Province 时,它只输出值,所以如果我使用 select 不列颠哥伦比亚省,它会将其输出为“bc”。如何输出 selection 的标签,使其输出“British Columbia”?

我相信那些标签只是在编辑中 ui 并且不能被令牌拉取。

请阅读这里:

虽然可能有一种方法可以从实体或值获取标签,但还有另一种选择,但需要一些步骤才能到达那里。

首先,您必须标准化您的值以匹配 ISO 和 DNN 已经 存储的内容。在任何 DNN 数据库中查看 dbo.Lists table。

SELECT * FROM [dbo].[Lists] WHERE ListName = 'Region'

例如,您必须将爱德华王子岛的下拉值设置为“PE”

然后您可以使用 DNN 的 ListController 获取加拿大的区域,将此代码放入视图中,它会生成 DNN 内置的 name/value 对:

@using DotNetNuke.Common.Lists
@{
  IEnumerable<ListEntryInfo> listEntryInfoCol = (new ListController()).GetListEntryInfoItems("Region", "Country.CA");
}
<pre>
Value = Text:
  @foreach( var region in listEntryInfoCol ) {
<span>@region.Value = @region.Text</span>
  }
</pre>

您可能想要提取一个字典或数组,然后您可以使用该值作为键来获取您需要的文本。

所以我在代码中说你会从 DNN 列表加载你的 CA 区域,然后当你想为 PE 输出“爱德华王子岛”时,@dictRegions["PE"]。

我最终使用了这种方法:

 @{
    var provinceMappings = new Dictionary<string, string>();
                provinceMappings.Add("ab", "Alberta");
                provinceMappings.Add("bc", "British Columbia");
                provinceMappings.Add("mb", "Manitoba");
                provinceMappings.Add("nb", "New Brunswick");
                provinceMappings.Add("nl", "Newfoundland &amp; Labrador");
                provinceMappings.Add("nwt", "Northwest Territories");
                provinceMappings.Add("ns", "Nova Scotia");
                provinceMappings.Add("nu", "Nunavut");
                provinceMappings.Add("on", "Ontario");
                provinceMappings.Add("pei", "Prince Edward Island");
                provinceMappings.Add("qc", "Quebec");
                provinceMappings.Add("sk", "Saskwatchewan");
                provinceMappings.Add("yt", "Yukon Territories");
    }

@provinceMappings[p]

你看到我上面的回答了吗?您正在复制 DNN 中已有的内容。我想我还没说到重点...

所以看看这个。我不确定如何降低 Linq/Lambda 部分的复杂性,但从技术上讲它只是一行代码。 ;)

也许您或其他人可以简化它。但由于 DNN 已经内置了所有数据,下面是将其输入 provinceMappings 字典的方法:

@using DotNetNuke.Common.Lists
@using System.Linq
@{
  Dictionary<string, string> provinceMappings = (new ListController())
    .GetListEntryInfoDictionary("Region", "Country.CA")
    .Select(x => new { x.Value.Value, x.Value.Text } )
    .ToDictionary(x => x.Value, x => x.Text );

  <pre>
  That's it, done, now you can use it like you want:
  provinceMappings["PE"] = @provinceMappings["PE"]

  Key: Value
  @foreach( var region in provinceMappings ) {
  <span>@region.Key: @region.Value</span>
  }

  Count: @provinceMappings.Count()
  Type: @provinceMappings.GetType()
  JSON: @DotNetNuke.Common.Utilities.JsonExtensionsWeb.ToJson(provinceMappings)
  </pre>
}

将其放在一个视图中,您可以看到 provinceMappings 具有您需要从 DNN 填充的内容,您无需构建。如果您不想将其放入视图中,则输出如下所示,

一个小更新:我创建了一个教程示例,展示了如何在 C# 中访问已配置的下拉属性。这并不能完全回答这里的问题,但可能对寻找这样的东西的人有用:

https://2sxc.org/dnn-tutorials/en/razor/data910/page