The long answer. Property Converters have been enabled by default, so you should be able to do
var img = Model.Content.GetPropertyValue<IPublishedContent>("myImageAlias");
Then you can render your image like so
<img src="@img.Url" alt="@img.Name" />
If you've needed to disable them for legacy reasons, the following code should work
var img = Umbraco.TypedMedia(Model.Content.GetPropertyValue<Udi>('myImageAlias"));
Currently I am using umbraco.NodeFactory and using umbraco.cms.businesslogic.media.
public static CalloutModel CalloutModelFromNode(Node node)
{
ImageTest = node.GetProperty
Is it possible to return a URL using the above in Umbraco 7.10. I'd think someone would have wrote an tutorial on how to do this. I will do it if I ever get a detailed answer.
The response I've given you should work in Umbraco 7.10.
I've not worked with the 2 namespaces myself, but I believe they're for legacy/older versions of Umbraco and (I may be wrong here), but I don't believe you should be using them.
Perhaps you could share some more of your code, specifically the view, this will help us see what you're actually doing, and why it's not rendering.
I've looked at the source code, and it looks like you might be able to do.
var img = new umbraco.cms.businesslogic.media.Media(Model.Content.GetPropertyValue<Udi>('myImageAlias")), but I can't be 100% sure.
The uses the MediaService though, which isn't performance friendly.
Do you have a sample of an entire C# class that can do this?
What I am doing probably is not compatible. I run into issues when using
using umbraco.cms.businesslogic.media;
using Umbraco.Core.Models;
I don't think they are compatible in same class.
So what I am trying to do. Is get an Image's URL from the Media picker in a C# class.
In the past I used umbraco.NodeFactory; Which still works for 99% of what I did in the past.
Now I am running into nothing but issues trying to figure out how to get the IMAGE url from the Document Type Property which is a Media Picker.
Not sure how you even set this up in New Umbraco as we had to shotgun this project within a small time span. Getting from Umbraco 6 to 7 took a bunch of time as it was.
As per my first comment, Umbraco.TypedMedia(UDI_HERE) should return you an IPublishedContent, from there you can access the Url property.
Let's step back a bit, where have you obtained this Udi/String from?
How are you currently getting it?
Your first post says you're using Model.Content.GetPropertyValue().
If that is so, you should also be able to do Model.Content.GetPropertyValue<IPublishedContent>("myImageAlias").Url to directly get the URL (obviously you'd want to add some null checks in there though)
This is the new way I've gone to try to get values. Still running into same issue.
var ModelC = ApplicationContext.Current.Services.ContentTypeService.GetContentType("APiTestPage");
var ModelCId = 13320; // Hardcoded for now
var PageModel = ApplicationContext.Current.Services.ContentService.GetById(ModelCId);
var imageProperty = PageModel.GetValue("singleImageTest");
var udiResult = Udi.Parse(imageProperty.ToString());
And the same damn result. BANG HEAD AGAINST WALL. Thee is something about the UDI that eludes me
In your example code, I can't see you using Umbraco.TypedMedia() anywhere.
A UDI is simply a 'key' to the image. Every image has a unique one. They're a partial replacement for numeric IDs.
As mentioned before, I'm not familar with the Umbraco 6 approaches such as uQuery, but I do believe that all you need to add to your code is this:
var img = Umbraco.TypedMedia(udiResult);
var imgUrl = String.Empty;
if(img != null) {
imgUrl = img.Url;
}
return imgUrl;
By the way, the use of ApplicationContext is very bad for performance. It will it the database each time. I'd recommend swapping this out for var pageModel = Umbraco.TypedContentAtXPath("//APiTestPage") or a similar method.
Are you trying to use this code in Razor, or in a controller?
If you are using this for front end behaviour, it is generally bad practice to be using the content services as these hit the database. Instead there are other ways to get the information.
If you are in Razor, you can do the following to get your Media item URL:
(Assumption made: a. your razor view inherits from UmbracoTemplatePage, b. the property is on the current document type, c. property has an alias of 'myMediaItem', d. you aren't using ModelsBuilder)
//This line will get you the contents of the property
var myMediaItem = Model.Content.GetPropertyValue<IPublishedContent>("myMediaItem");
// Lets check that the above line didn't return null and if it didn't get the url from the published content, else provide an empty string.
var mediaItemUrl = myMediaItem != null ? myMediaItem.Url : string.Empty;
If you are using a SurfaceController then you can do the following (it's very similar and the same assumptions are being made)
//This line will get you the contents of the property
var myMediaItem = Umbraco.AssignedContentItem.GetPropertyValue<IPublishedContent>("myMediaItem");
// Lets check that the above line didn't return null and if it didn't get the url from the published content, else provide an empty string.
var mediaItemUrl = myMediaItem != null ? myMediaItem.Url : string.Empty;
Now, with this approach we just need to be a little bit more careful as it is (although unlikely in my experience) possible that Umbraco.AssignedContentItem can be null so you might want to double check that.
If you are using an API controller of some sort then things are a little different as you don't usually have a current page. But if you use the UmbracoHelper to find your page instead using node or content services you will be accessing the cache for the site. This means you will get IPublishedContent back and you can use the same premise discussed above to get your media details.
Does that help explain things for you?
With regards to UDI's, there are two types, as I understand it, there are GuidUDI's and Integer UDIs (I can't remember the class names for them both).
The UDI isn't you url, it is simply an identifier for the content you are after. Once you have your UDI, you need to then look up the actual item using it. I think (I'm not 100%) that this can be done using the UmbracoHelper in a similar way to having the ID. This will then return an IPublishedContent (even for media), against which you can access the property URL which will give you the url of the page, or underlying media item.
If things are still unclear, please keep asking. The more details you can provide about setup, configuration, use case, version of Umbraco etc the better. And if you can provide a full sample code snippet of your objective that is helpful as well (I know that isn't always possible).
Thanks to everyone for helping out. Michael's suggestion sorted out my issue! I really appreciated everyone's help.
This is what worked for me!
using Umbraco.Core;
using Umbraco.Web;
//Going to Need this
UmbracoHelper uHelper = new UmbracoHelper(UmbracoContext.Current);
var ModelC = ApplicationContext.Current.Services.ContentTypeService.GetContentType("APiTestPage");
var TestI = ModelC.Name;
var ModelCId = 13320;
var PageModel = ApplicationContext.Current.Services.ContentService.GetById(ModelCId);
var imageProperty = PageModel.GetValue("singleImageTest");
var properties = PageModel.GetType().GetProperties();
var udiResult = Udi.Parse((imageProperty.ToString()));
var imgUrl = uHelper.TypedMedia(udiResult);
string urlStr = imgUrl.Url;
return new ImageModel
{
Url = urlStr
};
public static IPublishedContent GetPublishedContentByUdi(string udi)
{
var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
return umbracoHelper.TypedContent(udi);
}
This is quite an old post but even today this question still is not easy to answer.
I am using Umbraco v13 with Commerce and the PaymentMethodReadOnly object has a field named ImageId (of type string) where I ran into this issue.
A sample value of this field is "umb://media/a11031cdc1194db281331f69db9d5f21"
Much searching led me to this post, but in my case, not really an answer I could use.
My solution that I eventually arrived at was this:
First get the guid value from the string.
Guid.TryParse(paymentMethod.ImageId.Replace("umb://media/", ""), out Guid guidResult)
Then I have a service that does all my db type interactions so I have a method there like this:
public T? GetMediaItemByReference<T>(IUmbracoContext context, Guid referenceNumber) where T : class
{
T? returnItem = null;
if (context.Media != null)
{
var foundtem = context.Media.GetById(referenceNumber);
if (foundtem != null)
{
returnItem = foundtem as T;
}
}
return returnItem;
}
Calling this method with the type of Image
var logoMediaItem = _cmsDataService.GetMediaItemByReference<Image>(context, guidResult);
returnUrl = logoMediaItem?.GetCropUrl() ?? string.Empty;
So now I have an actual url to use in my image src.
C# Cannot figure out how to convert umb://media/ to URL Umbraco 7.10
Can someone help me out.
public static ImageModel GetPageImage(Node node){ ImageTest = node.GetProperty
Outputs umb://media/881492659b004247acbd24f97a8339a7
I've tried numerous / numerous solutions with no avail.
Can someone point me to straightforward c# solution that solves this issue . Or help explain to me how to solve.
Model.Content.GetPropertyValue
I'm not sure how to utilize the IPublishedContent
The short answer. Use
Umbraco.TypedMedia()
The long answer. Property Converters have been enabled by default, so you should be able to do
var img = Model.Content.GetPropertyValue<IPublishedContent>("myImageAlias");
Then you can render your image like so
<img src="@img.Url" alt="@img.Name" />
If you've needed to disable them for legacy reasons, the following code should work
var img = Umbraco.TypedMedia(Model.Content.GetPropertyValue<Udi>('myImageAlias"));
I don't understand the solution above.
Currently I am using umbraco.NodeFactory and using umbraco.cms.businesslogic.media.
public static CalloutModel CalloutModelFromNode(Node node) { ImageTest = node.GetProperty
Is it possible to return a URL using the above in Umbraco 7.10. I'd think someone would have wrote an tutorial on how to do this. I will do it if I ever get a detailed answer.
Hi Christophe,
The response I've given you should work in Umbraco 7.10.
I've not worked with the 2 namespaces myself, but I believe they're for legacy/older versions of Umbraco and (I may be wrong here), but I don't believe you should be using them.
Perhaps you could share some more of your code, specifically the view, this will help us see what you're actually doing, and why it's not rendering.
I've looked at the source code, and it looks like you might be able to do.
var img = new umbraco.cms.businesslogic.media.Media(Model.Content.GetPropertyValue<Udi>('myImageAlias"))
, but I can't be 100% sure.The uses the
MediaService
though, which isn't performance friendly.Do you have a sample of an entire C# class that can do this?
What I am doing probably is not compatible. I run into issues when using using umbraco.cms.businesslogic.media; using Umbraco.Core.Models;
I don't think they are compatible in same class.
So what I am trying to do. Is get an Image's URL from the Media picker in a C# class.
In the past I used umbraco.NodeFactory; Which still works for 99% of what I did in the past.
Now I am running into nothing but issues trying to figure out how to get the IMAGE url from the Document Type Property which is a Media Picker.
Not sure how you even set this up in New Umbraco as we had to shotgun this project within a small time span. Getting from Umbraco 6 to 7 took a bunch of time as it was.
Complete sample. Would be super helpful as many of us learn by examples. These snipets have been hard to understand
Where exactly are you trying to put this code? What I've provided should be able to dumped into a cshtml and will render image.
If I can you're existing code, I might be able to assist further.
I've only worked with Umbraco 7 though
The main problem I am running into is that I am using NodeServices & Uquery.
I think I am asking the wrong question.
How do I convert a string "umb://media/881492659b004247acbd24f97a8339a7 " into a URL.
Is this even Possible.
I'm refactoring some code hoping to solve this enigmatic problem
Hi Christophe,
As per my first comment,
Umbraco.TypedMedia(UDI_HERE)
should return you anIPublishedContent
, from there you can access theUrl
property.Let's step back a bit, where have you obtained this Udi/String from? How are you currently getting it?
Your first post says you're using
Model.Content.GetPropertyValue()
.If that is so, you should also be able to do
Model.Content.GetPropertyValue<IPublishedContent>("myImageAlias").Url
to directly get the URL (obviously you'd want to add some null checks in there though)I'm not sure how to setup Model.Content in my current solution.
Content is not an option for this
Can you do
global.GetProperty<Udi>("myImageAlias")
instead? How have you been getting the Udi previously?Umbraco.TypedMedia("umb://media/881492659b004247acbd24f97a8339a7")
should work I believe. Have you tried that at all?If not, you'll need
Udi.Parse(...)
If I do
that comes back with {umb://media/881492659b004247acbd24f97a8339a7}
comes back with {umb://media/881492659b004247acbd24f97a8339a7}
I'm not sure if this will help. In A razor view your code works fine.
Exposing this in an API does not work as anticipated
This is the new way I've gone to try to get values. Still running into same issue.
And the same damn result. BANG HEAD AGAINST WALL. Thee is something about the UDI that eludes me
In your example code, I can't see you using
Umbraco.TypedMedia()
anywhere.A UDI is simply a 'key' to the image. Every image has a unique one. They're a partial replacement for numeric IDs.
As mentioned before, I'm not familar with the Umbraco 6 approaches such as
uQuery
, but I do believe that all you need to add to your code is this:By the way, the use of ApplicationContext is very bad for performance. It will it the database each time. I'd recommend swapping this out for
var pageModel = Umbraco.TypedContentAtXPath("//APiTestPage")
or a similar method.Hey Christophe,
You could try this:
and then proceed with normal media id.
Thanks, Mike
Hi Christophe,
Are you trying to use this code in Razor, or in a controller? If you are using this for front end behaviour, it is generally bad practice to be using the content services as these hit the database. Instead there are other ways to get the information.
If you are in Razor, you can do the following to get your Media item URL:
(Assumption made: a. your razor view inherits from UmbracoTemplatePage, b. the property is on the current document type, c. property has an alias of 'myMediaItem', d. you aren't using ModelsBuilder)
If you are using a SurfaceController then you can do the following (it's very similar and the same assumptions are being made)
Now, with this approach we just need to be a little bit more careful as it is (although unlikely in my experience) possible that
Umbraco.AssignedContentItem
can be null so you might want to double check that.If you are using an API controller of some sort then things are a little different as you don't usually have a current page. But if you use the
UmbracoHelper
to find your page instead using node or content services you will be accessing the cache for the site. This means you will get IPublishedContent back and you can use the same premise discussed above to get your media details.Does that help explain things for you?
With regards to UDI's, there are two types, as I understand it, there are GuidUDI's and Integer UDIs (I can't remember the class names for them both).
The UDI isn't you url, it is simply an identifier for the content you are after. Once you have your UDI, you need to then look up the actual item using it. I think (I'm not 100%) that this can be done using the UmbracoHelper in a similar way to having the ID. This will then return an IPublishedContent (even for media), against which you can access the property URL which will give you the url of the page, or underlying media item.
If things are still unclear, please keep asking. The more details you can provide about setup, configuration, use case, version of Umbraco etc the better. And if you can provide a full sample code snippet of your objective that is helpful as well (I know that isn't always possible).
Thanks,
Nik
Thanks to everyone for helping out. Michael's suggestion sorted out my issue! I really appreciated everyone's help. This is what worked for me!
Glad you got it working in the end. Don't forget to mark this topic as resolved :)
Hi Guys,
Here is a method I use for this.
Hope it helps,
Kind Regards
David
This is quite an old post but even today this question still is not easy to answer.
I am using Umbraco v13 with Commerce and the PaymentMethodReadOnly object has a field named ImageId (of type string) where I ran into this issue.
A sample value of this field is "umb://media/a11031cdc1194db281331f69db9d5f21"
Much searching led me to this post, but in my case, not really an answer I could use.
My solution that I eventually arrived at was this:
First get the guid value from the string.
Guid.TryParse(paymentMethod.ImageId.Replace("umb://media/", ""), out Guid guidResult)
Then I have a service that does all my db type interactions so I have a method there like this:
Calling this method with the type of Image
So now I have an actual url to use in my image src.
is working on a reply...