+1-888-365-2779
Try Now
More in this section

Forums / Developing with Sitefinity / Adding Related Items To Dynamic Content Items

Adding Related Items To Dynamic Content Items

8 posts, 0 answered
  1. Brett Whittington
    Brett Whittington avatar
    33 posts
    Registered:
    12 Jan 2012
    22 Apr 2014
    Link to this post

    I've spent the day trying get an image added as a ContentLink to a Dynamic Module I've built in a Multi-Site Sitefinity 7.0 instance.  I've searched the forums and Google and everything I've found doesn't work and gives me the following error at runtime.

    An exception of type 'System.InvalidCastException' occurred in mscorlib.dll but was not handled in user code

     Additional information: Object must implement IConvertible.  Here's the code:

    var providerName = "dynamicProvider2";
                var cultureName = "en";
                Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureName);
                DynamicModuleManager dynamicModuleManager = DynamicModuleManager.GetManager(providerName);
                Type zooMomentType = TypeResolutionService.ResolveType("Telerik.Sitefinity.DynamicTypes.Model.ZooMoments.ZooMoment");
                DynamicContent zooMomentItem = dynamicModuleManager.CreateDataItem(zooMomentType);
                zooMomentItem.SetValue("EmailAddress", txtEmailAddress.Text);
                zooMomentItem.SetValue("FirstName", this.txtFirstName.Text);
                zooMomentItem.SetValue("LastName", this.txtLastName.Text);
                zooMomentItem.SetValue("HomeCity", this.txtHomeCity.Text);
                zooMomentItem.SetValue("HomeState", this.ddlHomeState.SelectedValue);
                zooMomentItem.SetValue("ZooLocation", this.ddlZooLocation.SelectedValue);
                zooMomentItem.SetValue("MomentDescription", this.txtZooMomentDescription.Text);
                var splitDate = this.txtVisitationDate.Text.Split('/');
                int months;
                int years;
                int.TryParse(splitDate[0], out months);
                int.TryParse(splitDate[1], out years);
                zooMomentItem.SetValue("VisitationDate", new DateTime(years, months, 1));
                zooMomentItem.UrlName = new Lstring(Guid.NewGuid().ToString());
                zooMomentItem.SetValue("Owner", SecurityManager.GetCurrentUserId());
                zooMomentItem.SetValue("PublicationDate", DateTime.Now);
                var image = UploadImage(uplZooMomentPhoto);
                if (image != null)
                {
                    //Throws Object must implement IConvertible.
                    zooMomentItem.SetValue("MomentImage", image);
     
                    //Throws Object must implement IConvertible.
                    //zooMomentItem.AddImage("MomentImage", img);
     
                    //Doesn't throw error and inserts into the Database but the related item does not show up on the Add/Edit Screen of the module.
                    //var contentLinkManager = ContentLinksManager.GetManager();
                    //var link = contentLinkManager.GetContentLink(image.Parent.Id, typeof(Telerik.Sitefinity.Libraries.Model.Image), "MomentImage");
                    //if (link == null)
                    //{
                    //    link = contentLinkManager.CreateContentLink("MomentImage", zooMomentItem, image);
                    //    link.ChildItemAdditionalInfo = image.ThumbnailUrl;
                    //    link.ParentItemProviderName = providerName;
                    //}
                    //else
                    //{
                    //    link.ChildItemId = image.Id;
                    //}
                    //contentLinkManager.SaveChanges();
                }
                zooMomentItem.SetWorkflowStatus(dynamicModuleManager.Provider.ApplicationName, "Draft", new CultureInfo(cultureName));
                dynamicModuleManager.SaveChanges();

    So I left the 3 things I tried in the code above commented out.   as changed with I am wondering if this has changed with Sitefinity 7 or if it is a difference with Multi-Site.    The img variable is a Sitefinity Image so the type should be okay.

    How can I add this related data programmatically without getting this error.

  2. Brett Whittington
    Brett Whittington avatar
    33 posts
    Registered:
    12 Jan 2012
    23 Apr 2014 in reply to Brett Whittington
    Link to this post

    So I found the solution to my problem browsing through the depths JustDecompile on Sitefinity's codebase.  I believe that the new related data items that were introduced in Sitefinity 7 have now broken the previous way of creating content links on dynamic modules.  The methods in question are AddImage(), AddFile(), AddVideo() found in Telerik.Sitefinity.Model.

    Using these methods results in the following exception at runtime:

    An exception of type 'System.InvalidCastException' occurred in mscorlib.dll but was not handled in user code

    Additional information: Object must implement IConvertible

    .The solution to the problem resides with the extension methods found in Telerik.Sitefinity.RelatedData and the method to use is CreateRelation().

     
    To fix my code I had to replace the following code
    zooMomentItem.AddImage("MomentImage", img);

    with
    zooMomentItem.CreateRelation(image, "MomentImage");

    The new related data concept in Sitefinity 7 is a great new feature but I wish that some of this stuff would have been spelled out better.  I burned through 2 days trying to find this solution.  Hope this helps someone else!

  3. theksmith
    theksmith avatar
    5 posts
    Registered:
    19 Nov 2010
    13 Jan 2015
    Link to this post
    Brett, thank you for posting this. i was receiving the same error when trying to tie together related products (using the SetContentLink() extension method). the solution you posted to use Telerik.Sitefinity.RelatedData.CreateRelation() worked for my situation as well.

    i agree that the documentation for the past few versions of Sitefinity is missing major information necessary to complete basic tasks (or else the info is nearly impossible to locate) - i've also resorted to using a decompiler (dotPeek) on several occasions.
  4. Sophie
    Sophie avatar
    0 posts
    Registered:
    05 Jul 2016
    06 Oct
    Link to this post

    Thanks for sharing these information impossible to find elsewhere...

    However, I am trying to do the same with a file (doc is of type Document in my code below) and the files do not appear in the dynamic module:

     theApplication.CreateRelation(doc, "CV");   

    Any idea how to resolve the problem?

  5. Brett Whittington
    Brett Whittington avatar
    33 posts
    Registered:
    12 Jan 2012
    06 Oct
    Link to this post

    Hello Sophie!  It's been several years since I have worked on this but I will try to help you as best I can.  Can you tell me what version of Sitefinity you are working on?  Things might have changed between version 7.0 and 9.0.

    Do you have reference to the document you are trying to relate to?  In my example, I was also uploading an image.  I would first insert and SaveChanges() that image in the Images modules.  In your case, you would do this a document in the document & files module.

    After the image was published, I then created my dynamic module item, and used the CreateRelation() code mentioned above with reference to the document in it.

  6. Sophie
    Sophie avatar
    0 posts
    Registered:
    05 Jul 2016
    07 Oct
    Link to this post

    Hello Brett,

    Thanks a lot for your fast answer! Indeed I am working on Sitefinity 9.1.

    And yes I uploaded the file in a sub-library of Document & Files library and used SaveChanges (this code has been already tested and works fine). 

    Then I used CreateRelation(doc,"CV") where "doc" has a type Document.

    Do you think the problem is due to the fact that my CV is in a sub-library or due to the type of "doc" used in the method CreateRelation?

    Thanks.

  7. Sophie
    Sophie avatar
    0 posts
    Registered:
    05 Jul 2016
    07 Oct
    Link to this post

    I found the problem...

    I forgot to save changes of the dynamic module after the modifications

    dynamicModuleManager.SaveChanges();

  8. Brett Whittington
    Brett Whittington avatar
    33 posts
    Registered:
    12 Jan 2012
    07 Oct in reply to Sophie
    Link to this post
    I'm glad I could be your rubber duck
8 posts, 0 answered