May 20, 2019

SharePoint: Update List Content Type via REST from SPFx web part

Task

I needed to set ReadOnly property of a SPList Content Type from my SPFx web part. I’m using @pnp/sp library, but it doesn’t support modifying existing Content Types.

Solution

Changing the ReadOnly property of an existing list content type is possible using REST, but I had some troubles finding out correct set of HTTP body and header payloads. Working code can be found below.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const spOpts: ISPHttpClientOptions = {
  headers: { 'Accept': 'application/json;odata=verbose', 'X-HTTP-Method': 'MERGE', 'odata-version': '3.0' },
  body: JSON.stringify({
    __metadata: {
      type: 'SP.ContentType'
    },            
    ReadOnly: false
  })
};

let oldCt: ContentType = list.contentTypes.getById('0x01CONTENTTYPEID');

await this.props.context.spHttpClient.post(
  oldCt.toUrlAndQuery(),
  SPHttpClient.configurations.v1,
  spOpts
);


Thoughts

For later reference when investigating similar issues, here’s a collection of error messages depending what Header parameter is missing or invalid.

Without this header propertyYou got error
'Accept': 'application/json;odata=verbose' The property '__metadata' does not exist on type 'SP.ContentType'. Make sure to only use property names that are defined by the type.

Note: This is not required, as odata will be verbose by default unless you have manually set it to, e.g., nometadata. I usually set it to nometadata to improve performance as verbose metadata results of REST calls are not usually required. odata=minimalmetadata is not enough.
'X-HTTP-Method': 'MERGE' The parameter __metadata does not exist in method GetById.
'odata-version': ‘3.0’ Parsing JSON Light feeds or entries in requests without entity set is not supported. Pass in the entity set as a parameter to ODataMessageReader.CreateODataEntryReader or ODataMessageReader.CreateODataFeedReader method.

Note: By default, odata-version will be 4.0, and it doesn’t work here.

No comments:

Post a Comment