{"id":30420809,"url":"https://github.com/abjerner/limbo.umbraco.multinodetreepicker","last_synced_at":"2026-02-24T19:02:25.557Z","repository":{"id":65378452,"uuid":"533357109","full_name":"abjerner/Limbo.Umbraco.MultiNodeTreePicker","owner":"abjerner","description":"Custom multinode treepicker for Umbraco.","archived":false,"fork":false,"pushed_at":"2025-05-14T21:36:15.000Z","size":871,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"v13/main","last_synced_at":"2025-08-21T04:16:36.564Z","etag":null,"topics":["limbo","mntp","multi-node-tree-picker","skybrud","umbraco","umbraco-package","umbraco-v11","umbracov10","umbravo-v9"],"latest_commit_sha":null,"homepage":"https://packages.limbo.works/limbo.umbraco.multinodetreepicker/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abjerner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-09-06T14:15:57.000Z","updated_at":"2025-05-14T21:36:19.000Z","dependencies_parsed_at":"2024-11-13T19:29:32.967Z","dependency_job_id":"2183917b-3a02-4074-adbd-7448cfe85630","html_url":"https://github.com/abjerner/Limbo.Umbraco.MultiNodeTreePicker","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/abjerner/Limbo.Umbraco.MultiNodeTreePicker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abjerner%2FLimbo.Umbraco.MultiNodeTreePicker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abjerner%2FLimbo.Umbraco.MultiNodeTreePicker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abjerner%2FLimbo.Umbraco.MultiNodeTreePicker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abjerner%2FLimbo.Umbraco.MultiNodeTreePicker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abjerner","download_url":"https://codeload.github.com/abjerner/Limbo.Umbraco.MultiNodeTreePicker/tar.gz/refs/heads/v13/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abjerner%2FLimbo.Umbraco.MultiNodeTreePicker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271606605,"owners_count":24788981,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-22T02:00:08.480Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["limbo","mntp","multi-node-tree-picker","skybrud","umbraco","umbraco-package","umbraco-v11","umbracov10","umbravo-v9"],"created_at":"2025-08-22T08:20:15.173Z","updated_at":"2026-02-24T19:02:25.552Z","avatar_url":"https://github.com/abjerner.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Limbo Multinode Treepicker\n\n[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/abjerner/Limbo.Umbraco.MultiNodeTreePicker/blob/v13/main/LICENSE.md)\n[![NuGet](https://img.shields.io/nuget/vpre/Limbo.Umbraco.MultiNodeTreePicker.svg)](https://www.nuget.org/packages/Limbo.Umbraco.MultiNodeTreePicker)\n[![NuGet](https://img.shields.io/nuget/dt/Limbo.Umbraco.MultiNodeTreePicker.svg)](https://www.nuget.org/packages/Limbo.Umbraco.MultiNodeTreePicker)\n[![Umbraco Marketplace](https://img.shields.io/badge/umbraco-marketplace-%233544B1)](https://marketplace.umbraco.com/package/limbo.umbraco.multinodetreepicker)\n[![Limbo.Umbraco.MultiNodeTreePicker at packages.limbo.works](https://img.shields.io/badge/limbo-packages-blue)](https://packages.limbo.works/limbo.umbraco.multinodetreepicker/)\n\u003c!--[![Our Umbraco](https://img.shields.io/badge/our-umbraco-%233544B1)](https://our.umbraco.com/packages/backoffice-extensions/limbo-multinode-treepicker/)--\u003e\n\n**Limbo.Umbraco.MultiNodeTreePicker** adds a special multinode treepicker to the Umbraco backoffice in which developers can select a custom item converter.\n\nThe purpose of an item converter is to control the C# type returned by the `.Value()` method or the corresponding property in a ModelsBuilder generated model. This is particular useful in a SPA/Headless Umbraco implementation, where the ModelsBuilder model can then be returned directly via a WebAPI endpoint.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eLicense:\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003ca href=\"https://github.com/abjerner/Limbo.Umbraco.MultiNodeTreePicker/blob/v13/main/LICENSE.md\"\u003e\u003cstrong\u003eMIT License\u003c/strong\u003e\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eUmbraco:\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003eUmbraco 13\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cstrong\u003eTarget Framework:\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd\u003e.NET 8\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\n\n\n\n\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n## Installation\n\nThe package targets Umbraco 13 and is only available via [**NuGet**][NuGetPackage]. To install the package, you can use either .NET CLI\n\n```\ndotnet add package Limbo.Umbraco.MultiNodeTreePicker --version 13.0.4\n```\n\nor the NuGet Package Manager:\n\n```\nInstall-Package Limbo.Umbraco.MultiNodeTreePicker -Version 13.0.4\n```\n\n### Umbraco 10, 11 and 12\n\nSee the [**`v1.x`**](https://github.com/limbo-works/Limbo.Umbraco.MultiNodeTreePicker/tree/v1/main) branch.\n\n### Umbraco 8 and 9\n\nSee our older [**Skybrud.Umbraco.MultiNodeTreePicker**](https://github.com/skybrud/Skybrud.Umbraco.MultiNodeTreePicker) package.\n\n[NuGetPackage]: https://www.nuget.org/packages/Limbo.Umbraco.MultiNodeTreePicker\n[GitHubRelease]: https://github.com/abjerner/Limbo.Umbraco.MultiNodeTreePicker/releases\n\n\n\n\n\n\n\n\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n## Examples\n\nAt [**@limbo-works**](https://github.com/limbo-works) we typically use Umbraco as a headless CMS, and being able to control the generated models therefore makes a lot of sense. If a given page has some related content, it doesn't make sense for us to return the full model of a related model, so we instead have an item class with the needed properties - this class could be called `TestItem`.\n\nNormally the property with the related content would return the full model for each page, but with the special multinode treepicker from this package, we can implement a custom item converter.\n\nWe can do this by implementing the [`IMntpItemConverter`](https://github.com/abjerner/Skybrud.Umbraco.MultiNodeTreePicker/blob/master/src/Skybrud.Umbraco.MultiNodeTreePicker/Converters/IMntpItemConverter.cs) interface, but to get going a bit quicker, the package also contains the abstract [`MntpGenericItemConverter`](https://github.com/abjerner/Skybrud.Umbraco.MultiNodeTreePicker/blob/master/src/Skybrud.Umbraco.MultiNodeTreePicker/Converters/MntpGenericItemConverter.cs) class we can use instead:\n\n```csharp\npublic class TestMntpItemConverter : MntpGenericItemConverter\u003cTestItem\u003e {\n\n    public TestMntpItemConverter() : base(\"Default item converter\", x =\u003e new TestItem(x)) { }\n\n}\n```\n\n```csharp\npublic class TestItem {\n        \n        public Guid Key { get; }\n\n        public string Name { get; }\n\n        public string Url { get; }\n        \n        public TestItem(IPublishedContent content) {\n            Key = content.Key;\n            Name = content.Name;\n            Url = content.Url;\n        }\n\n    }\n```\n\nThe `MntpGenericItemConverter` class requires us to specify a name for the converter, and then a callback function that will be used for converting each `IPublishedContent` to the desired type.\n\n![image](https://user-images.githubusercontent.com/3634580/90198696-b2271d80-ddd2-11ea-8ac8-dd9f59a513f2.png)\n\nWhen the data type is configured to use our item converter (see screenshot above), properties of this type will now return `List\u003cTestItem\u003e` instead of `List\u003cIPublishedContent\u003e`.\n\nWith this special multinode treepicker, it's the datatype of the individual property, that determines the returned value. Another property could for instance be for selecting contact persons where we'd need a bit more information than what's available from the `TestItem` class, so we can create another item converter:\n\n```csharp\n  public class TestMntpPersonItemConverter : MntpGenericItemConverter\u003cTestPersonItem\u003e {\n\n      public TestMntpPersonItemConverter() : base(\"Person item converter\", x =\u003e new TestPersonItem(x)) { }\n\n  }\n```\n\n```csharp\n  public class TestPersonItem : TestItem {\n\n      public string Phone { get; }\n\n      public string Email { get; }\n\n      public TestPersonItem(IPublishedContent content) : base(content) {\n          Phone = content.Value\u003cstring\u003e(\"phone\");\n          Email = content.Value\u003cstring\u003e(\"email\");\n      }\n\n  }\n```\n\n![image](https://user-images.githubusercontent.com/3634580/90199149-3037f400-ddd4-11ea-93c0-ce7661e04531.png)\n\n\n\n\n\n\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n## Documentation\n\n- [See more at **packages.limbo.works**](https://packages.limbo.works/limbo.umbraco.multinodetreepicker/)\n\n\n\n\u003cbr /\u003e\u003cbr /\u003e\n\n## Inspiration\n\nThe item converters in this package was inspired by a similar concept in the [Contentment](https://github.com/leekelleher/umbraco-contentment) package. Thanks for creating and sharing this with us [**@leekelleher**](https://github.com/leekelleher) 👍\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabjerner%2Flimbo.umbraco.multinodetreepicker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabjerner%2Flimbo.umbraco.multinodetreepicker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabjerner%2Flimbo.umbraco.multinodetreepicker/lists"}