Search code examples
dotnetnuke2sxc

Best, Better, or Simpler Way to Get the Label for a Content-Type's Field


I thought I was doing something easy, but it got so complicated that I feel like I am missing something. We have a Content-Type (CT) that moves through a workflow. In each phase of the workflow, the output changes which fields are visible.

We want to easily access both the record's Value and Label. In other words, lets say we have a CT named EventInstance and one of fields is Url. So in code we normally just do @Content.Url. However, for table headings (and in other output) we want to display "Website Link (Url)" instead of "Url". So in the CT we simply changed the Name* (Label):

enter image description here

So then I went looking for how to get that "Label" field (2) instead of the Name (1). What I came up with was this. But it seems crazy complicated...

  public string GetLabelForField(dynamic de, string fieldName)
  {
    var attributes = AsEntity(de).Type.Attributes as IEnumerable<IContentTypeAttribute>;
    return attributes.First(t => t.Name == fieldName).Metadata.GetBestValue<string>("Name", "@All");
  }

And I call it like this

  var ev = listEvent.First();

<pre>
help.GetLabelForField(ev): @help.GetLabelForField(ev, "Url")
</pre>

And that outputs what I want:

help.GetLabelForField: Website Link (Url)

I realize I should be satisfied because it works, but it seems like a lot of work and a steep learning curve. Is there a better way to get access to this (seemingly common) property?


Solution

  • These APIs are not documented much, because accessing input-field configuration used in the Edit-UI isn't that common.

    But: I believe you could also do this (shorter, but probably not perfect):

      var attribute = AsEntity(de).Type[fieldName];
      var name = attribute.Metadata.GetBestValue<string>("Name");