TLDR: Don’t put spaces in your field names for Sitecore headless builds.
Quick post about a bug I uncovered today working on an XM Cloud project with a .NET rendering host.
We’re seeing inconsistent behavior when mapping layout service field data to types in .NET. In short, fields with spaces in the name sometimes do not deserialize into .NET types when you attempt to do so with the SDK.
Consider a page with 2 fields: Topic and Content Type. In our code, we have a class that looks like this:
namespace MySite.Models.Foundation.Base
{
public class PageBase
{
[SitecoreComponentField(Name = "Content Type")]
public ItemLinkField<Enumeration>? ContentType { get; set; }
[SitecoreComponentField(Name = "Topic")]
public ContentListField<Enumeration>? Topic { get; set; }
}
}
When I create a component as a ModelBoundView, .AddModelBoundView<PageBase>("PageHeader")
the fields map properly, and I get data in ContentType and Topic properties of my model.
When I try to map it from a service, like so:
namespace MySite.Services.SEO
{
public class MetadataService
{
private SitecoreLayoutResponse? _response;
public PageMetadata GetPageMetadata(SitecoreLayoutResponse? response)
{
_response = response;
PageBase pageBase= new PageBase ();
var sitecoreData = _response.Content.Sitecore;
sitecoreData.Route?.TryReadFields<PageBase>(out pageBase);
return pageMetadata;
}
}
}
I get no data in the Content Type field but I do in the Topic field. If I rename Content Type to ContentType, the field data is bound to the ContentType property as expected.
I dug into the code a little bit and it seems that the HandleReadFields
method on the Sitecore.LayoutService.Client.Response.Model.FieldsReader
is ignoring the property attributes: [SitecoreComponentField(Name = "Content Type")]
Instead it is just using the property name, which of course has no spaces in it because it’s a C# identifier.
Until this bug is corrected, the workaround is to rename your fields to not have spaces in them.