I have a document type that has Member Picker property editor and I need to set the value for it programmatically. Member that I need to put into that property is a custom Member Type. When I try to do it in the back office, it works, but I can't get it to work through an API. I've tried few things and it successfully creates node of that document type, but when I access that node through backoffice I always get this exception:
System.InvalidOperationException: Multiple actions were found that match the request: GetByIds on type Umbraco.Web.Editors.EntityController GetByIds on type Umbraco.Web.Editors.EntityController GetByIds on type Umbraco.Web.Editors.EntityController
Also, Member Picker doesn't show anything in node editor (as if it has no selected member).
What does your call to SetValue look like? That exception generally means that the saved value isn't in the format that the picker expected.
The multiple actions that the exception refers to accept IDs in different formats. If the provided value doesn't match any of those formats then it tries to pick one of the actions to call with an empty list of IDs, but has no way to decide.
public static int GetMemberIdProperty(IPublishedContent node, string memberProperty)
{
int id = 0;
if (node.HasValue(memberProperty))
{
var doctor = node.Value<IPublishedContent>(memberProperty);
id = doctor.Id;
}
return id;
}
public static IPublishedContent SetMemberIdProperty(PrescriptionViewModel prescription)
{
IPublishedContent doctor = ContentHelper.umbracoHelper.Member(prescription.DoctorId);
return doctor;
}
As I mentioned, Set method successfully creates new node, but when Get method is called, it throws this exception:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
On this line:
id = doctor.Id;
Also, when I debugged those two methods, I've seen that doctor variable gets null value.
One more thing. In documentation it says that Member Picker returns IPublishedContent, so I've tried to set it to that same type, but it doesn't work.
PS PrescrtiptionViewModel is a view model for document type Prescription that has Member Picker property (I use it for CRUD methods to work with JSON that I recieve through a HTTP request).
That makes sense, the pickers do store UDIs. When you pass the Member to SetValue, it ends up calling ToString() and storing the result in the database. But calling ToString() just returns "Umbraco.Core.Models.Member".
Passing in a Member, Content or Media to set a picker seems a perfectly reasonable thing to do, though. It would be good to get SetValue to handle that and store the UDI for you, and similarly handle passing in an IEnumerable<Media> for multiple pickers.
Programmatically setting Member Picker property
I have a document type that has Member Picker property editor and I need to set the value for it programmatically. Member that I need to put into that property is a custom Member Type. When I try to do it in the back office, it works, but I can't get it to work through an API. I've tried few things and it successfully creates node of that document type, but when I access that node through backoffice I always get this exception:
System.InvalidOperationException: Multiple actions were found that match the request: GetByIds on type Umbraco.Web.Editors.EntityController GetByIds on type Umbraco.Web.Editors.EntityController GetByIds on type Umbraco.Web.Editors.EntityController
Also, Member Picker doesn't show anything in node editor (as if it has no selected member).
Thanks in advance!
What does your call to
SetValue
look like? That exception generally means that the saved value isn't in the format that the picker expected.The multiple actions that the exception refers to accept IDs in different formats. If the provided value doesn't match any of those formats then it tries to pick one of the actions to call with an empty list of IDs, but has no way to decide.
Hi Steve, thanks for your reply!
Here's how my call of Set value looks:
And here's how my Get and Set methods look:
As I mentioned, Set method successfully creates new node, but when Get method is called, it throws this exception:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
On this line:
Also, when I debugged those two methods, I've seen that doctor variable gets null value.
One more thing. In documentation it says that Member Picker returns IPublishedContent, so I've tried to set it to that same type, but it doesn't work.
PS PrescrtiptionViewModel is a view model for document type Prescription that has Member Picker property (I use it for CRUD methods to work with JSON that I recieve through a HTTP request).
I GOT IT!
I've had similar problem with setting value for media picker and thought I could try doing the same thing AND IT WORKED!
Here's how I did it:
And then in the call:
Seems like you need Udi for setting values of all picker data types.
Hope it helps someone some day too!
That makes sense, the pickers do store UDIs. When you pass the
Member
toSetValue
, it ends up callingToString()
and storing the result in the database. But callingToString()
just returns "Umbraco.Core.Models.Member".Passing in a
Member
,Content
orMedia
to set a picker seems a perfectly reasonable thing to do, though. It would be good to getSetValue
to handle that and store the UDI for you, and similarly handle passing in anIEnumerable<Media>
for multiple pickers.For completeness as per Predrag's post.
If anyone is having trouble with Umbraco 8 then this is how I do it.
You basically need to get the UDI of the media item and use this to pass into the media picker field.
is working on a reply...