I am writing an Orchard theme, and I'd like to be able to locate some of the resources packaged with the theme (images/swfs etc).
What is the best way of doing this?
I've had a look at ResourceManifest files, using builder.Add.DefineResource but I can't seem to find it's counterpart in the view. Or do I just put the full path in?
Any hints?
Cheers Carl
I slapped together an extension method for a similar problem:
Resource Manifest Definition:
View Usage:
It's not well tested, and could probably use some error handling, but its working for me.
If you need to define the new resource (script or stylesheet):
For example:
This defines one style and script you can reuse in your views. Urls are relative to /Styles (or /Scripts) folders in your theme/module where the class is located.
If you want to reuse some of resources already defined (in all enabled modules and themes), it's as easy as writing eg.:
inside your .cshtml view file. Example above would inject mystyle.css and myscript.js at appropriate locations (header/footer of the final page).
Just a side note:
the solution posted by Adam Anderson works only when the controller class serving the view has the attribute
[Orchard.Themes.Themed(true)]
Just to be clear, there are a few methods depending on your situation. I'll outline the most common I know.
First of all, there is the inclusion of an external script or stylesheet on your particular part or theme. The standard syntax within a Razor template is this:
The include files will look for that particular resource in the corresponding
Style
orScripts
folder: for@Script.Include("YourPartEdit")
, it will look in the scripts folder forYourPartEdit.js
.You might have noticed that with
Script.Require
you can register a library with Orchard (in this case the registered one isjQuery
), and cause a module to require that particular script.To do this you create your own implementation of the
IResourceManifestProvider
interface, and implement theBuildManifests(ResourceManifestBuilder builder)
method and create a named resource. You can use.AtFoot()
or.AtHead()
to even target where it will go.Now say you want to reference a particular image, and you want to use Razor to always point to the correct image Url. First of all I recommend placing the image in your
Content
folder for your theme (assuming this is a theme related image), and you'll do something along these lines:Now, say this is on your
Layout.cshtml
page - you'll now successfully serve the image anywhere on the site.These particular techniques should account for a multitude of situations.
In stylesheets, relative paths (from the stylesheet path) should be used.
In views, you should use Url.Content.