Skip to main content
Home  › ... Razor

Content Items / Entities

Tutorial HomeContent
Requirements

Working with Entity (Item) Values

Every item a.k.a. object is called an Entity. Entities will have properties like NameProductNumber or Birthday, depending on the Content-Type they represent.

How your Razor Code receives Entities

When things are configured correctly, the right entities are given to your Razor-template so you can just show them or perform calculations as you need them. These are the common ways for the entities to be provided to your template:

  1. On simple templates, the UI allows users to add/edit content of a specific type (configured in the View). This content Entity is always available in your code in the variable called MyItem or Content on older Razors.
  2. On templates which expect many items of the same type, MyItem/Content contains the first item only. To access all (for iterating and showing each one) the Entities are in a variable called MyItems (Data on older Razors).
  3. If your code needs to find other data in the App, it can access it through App.Data.
  4. If your code want to get Entities which have been pre-selected/filtered etc. through a query, it will get them from Query

In this example the template is configured to contain an Entity of the type Person and has these fields:

  • FirstName: a string (text)
  • LastName: a string
  • Birthday: a date
  • Mugshot: a link to an image file
  • Awards: a reference to one or more other Entities which describe awards

So the following examples will show how to put the values in these fields into the HTML.

In the new typed RazorPro the current item is on a variable called MyItem. It's a typed object, so to read properties you need to specify what you want it, eg. @MyItem.String("FirstName").
This sample also uses the @MyItem.Picture(...) to automatically show a responsive image on the page.

In the dynamic Razor base classes lke Razor14 the current item is always available on the variable called Content. It's a dynamic object, so you can just type things like @Content.FirstName to access the properties.
This sample also uses the @Kit.Image.Img(...) to automatically show a responsive image on the page.

The samples can differ based on your Razor base class or if you're running an old version.
Selected: Strong-Typed (2sxc 17.06+) Switch to Typed (2sxc 16+) Switch to Dynamic (Razor14 or below)

Show Entity Values from the current Data

Showing values from Data (aka. Entities) is very easy. Normally they are accessed through Item (new Razor) or DynamicEntity (older Razor) objects. 

⬇️ Result | Source ➡️

  • Name: Douglas Adams
  • Birthday: 3/11/1952
  • Award: Hugo Award
@inherits Custom.Hybrid.RazorTyped
@using AppCode.Data

@{
  var person = As<Persons>(MyItem);
}
@person.Img("Mugshot", settings: "Square", width: 100, imgClass: "rounded-circle")
<ul>
  <li>
    Name: @person.FirstName @person.LastName
  </li>
  <li>
    Birthday: @person.Birthday.ToString("d")
  </li>
  <li>
    Award:
    @(person.Awards.FirstOrDefault()?.Name)
  </li>
</ul>

Source Code of Persons.cs

namespace AppCode.Data
{
  public partial class Persons
  {
    /// <summary>
    /// Custom property Presentation - as in these tutorials
    /// the Person always uses a QuickRefContentPresentation content-type for the presentation
    /// </summary>
    public new QuickRefContentPresentation Presentation => _presentation ??= As<QuickRefContentPresentation>(base.Presentation);
    private QuickRefContentPresentation _presentation;
  }
}

Source Code of Persons.Generated.cs

// DO NOT MODIFY THIS FILE - IT IS AUTO-GENERATED
// See also: https://go.2sxc.org/copilot-data
// To extend it, create a "Persons.cs" with this contents:
/*
namespace AppCode.Data
{
  public partial class Persons
  {
    // Add your own properties and methods here
  }
}
*/

// Generator:   CSharpDataModelsGenerator v17.08.00
// App/Edition: Tutorial-Razor/
// User:        2sic Web-Developer
// When:        2024-05-21 19:46:38Z
using System;
using System.Collections.Generic;
using System.Text.Json.Serialization;
using ToSic.Sxc.Adam;
using ToSic.Sxc.Data;

namespace AppCode.Data
{
  // This is a generated class for Persons 
  // To extend/modify it, see instructions above.

  /// <summary>
  /// Persons data. <br/>
  /// Generated 2024-05-21 19:46:38Z. Re-generate whenever you change the ContentType. <br/>
  /// <br/>
  /// Default properties such as `.Title` or `.Id` are provided in the base class. <br/>
  /// Most properties have a simple access, such as `.Awards`. <br/>
  /// For other properties or uses, use methods such as
  /// .IsNotEmpty("FieldName"), .String("FieldName"), .Children(...), .Picture(...), .Html(...).
  /// </summary>
  public partial class Persons: AutoGenerated.ZAutoGenPersons
  {  }
}

namespace AppCode.Data.AutoGenerated
{
  /// <summary>
  /// Auto-Generated base class for Default.Persons in separate namespace and special name to avoid accidental use.
  /// </summary>
  public abstract class ZAutoGenPersons: Custom.Data.CustomItem
  {
    /// <summary>
    /// Awards as list of PersonAwards.
    /// </summary>
    /// <remarks>
    /// Generated to return child-list child because field settings had Multi-Value=true. The type PersonAwards was specified in the field settings.
    /// </remarks>
    /// <returns>
    /// An IEnumerable of specified type, but can be empty.
    /// </returns>
    public IEnumerable<PersonAwards> Awards => _awards ??= _item.Children<PersonAwards>("Awards");
    private IEnumerable<PersonAwards> _awards;

    /// <summary>
    /// Biography as string. <br/>
    /// For advanced manipulation like scrubHtml, use .String("Biography", scrubHtml: true) etc.
    /// </summary>
    public string Biography => _item.String("Biography", fallback: "");

    /// <summary>
    /// Birthday as DateTime.
    /// </summary>
    public DateTime Birthday => _item.DateTime("Birthday");

    /// <summary>
    /// FavoriteNumber as int. <br/>
    /// To get other types use methods such as .Decimal("FavoriteNumber")
    /// </summary>
    public int FavoriteNumber => _item.Int("FavoriteNumber");

    /// <summary>
    /// FirstName as string. <br/>
    /// For advanced manipulation like scrubHtml, use .String("FirstName", scrubHtml: true) etc.
    /// </summary>
    public string FirstName => _item.String("FirstName", fallback: "");

    /// <summary>
    /// Haters as single item of ITypedItem.
    /// </summary>
    /// <remarks>
    /// Generated to only return 1 child because field settings had Multi-Value=false. 
    /// </remarks>
    /// <returns>
    /// A single item OR null if nothing found, so you can use ?? to provide alternate objects.
    /// </returns>
    public ITypedItem Haters => _haters ??= _item.Child("Haters");
    private ITypedItem _haters;

    /// <summary>
    /// IsAlive as bool. <br/>
    /// To get nullable use .Get("IsAlive") as bool?;
    /// </summary>
    public bool IsAlive => _item.Bool("IsAlive");

    /// <summary>
    /// LastName as string. <br/>
    /// For advanced manipulation like scrubHtml, use .String("LastName", scrubHtml: true) etc.
    /// </summary>
    public string LastName => _item.String("LastName", fallback: "");

    /// <summary>
    /// Mugshot as link (url). <br/>
    /// To get the underlying value like 'file:72' use String("Mugshot")
    /// </summary>
    public string Mugshot => _item.Url("Mugshot");

    /// <summary>
    /// Get the file object for Mugshot - or null if it's empty or not referencing a file.
    /// </summary>

    [JsonIgnore]
    public IFile MugshotFile => _item.File("Mugshot");

    /// <summary>
    /// Get the folder object for Mugshot.
    /// </summary>

    [JsonIgnore]
    public IFolder MugshotFolder => _item.Folder("Mugshot");

    /// <summary>
    /// Sex as string. <br/>
    /// For advanced manipulation like scrubHtml, use .String("Sex", scrubHtml: true) etc.
    /// </summary>
    public string Sex => _item.String("Sex", fallback: "");
  }
}

View Configuration

This is how this view would be configured for this sample.

  • Content/Item ContentType: Persons
  • Content/Item Data:
    1. Douglas (ID: 48832)

Note that Awards refers to other Entities of the type PersonAwards and has properties like Name. The above example showed the award Name using @Content.Awards.Name - which makes sense when you only expect one award. In other tutorials you'll see how to work with such related Entities if there are more than one.