Generic Selector Template URL for an Embedded Resource in a Class Library
I am walking through this example: Use a generic collection directive
I am using a class library and embedded resources for all my content files, and this seems to work fine for the designer view templates and my resource files, but when i get to defining the selector I am a bit confused about how to resolve the url for the selector template:
<
sf-collection
sf-data
=
"items"
sf-model
=
""
sf-multiselect
=
"true"
sf-identifier
=
"Generic Selector Example"
sf-deselectable
=
"true"
sf-template-url
=
"Designer/View/List/SfCollectionTemplate.html"
></
sf-collection
>
There is menu item for: Retrieve the URL reference to an embedded resource in the feather wiki, but there is nothing to find when you clink on the link. Watching the network in chrome developer tools, i see my templates pull like so:
Request URL:http://localhost:60876/Telerik.Sitefinity.Frontend/Designer/View/List/GenericSelector?controlId=5573ef13-ff23-6150-95dd-ff00009b1489&package=TicketOmaha
So I tried to mimic that behavior but without luck:
Request URL:http://localhost:60876/Frontend-Assembly/Telerik.Sitefinity.Frontend/Designer/View/List/SfCollectionTemplate.html?package=TicketOmaha
Request Method:GET
Status Code:404 Not Found
So does anyone have some guidance of advice? Do I need to implement my own embedded resource handler? I have done so before:
public class ResourceRouteHandler : IRouteHandler
IHttpHandler IRouteHandler.GetHttpHandler(RequestContext requestContext)
return new EmbeddedResourceHttpHandler(requestContext.RouteData);
public class EmbeddedResourceHttpHandler : IHttpHandler
private readonly RouteData _routeData;
public EmbeddedResourceHttpHandler(RouteData routeData)
_routeData = routeData;
public bool IsReusable
get return false;
public void ProcessRequest(HttpContext context)
var group = _routeData.Values["group"].ToString();
var fileName = _routeData.Values["file"].ToString();
var fileExtension = _routeData.Values["extension"].ToString();
if (!Regex.IsMatch(fileExtension, ("js|cs|png|sfhtml")))
throw new InvalidOperationException("Request not valid");
var nameSpace = GetType().Assembly.GetName().Name;
var manifestResourceName = string.Format("0.1.2.3",
nameSpace, group, fileName, fileExtension);
using (var stream = GetType().Assembly.GetManifestResourceStream(manifestResourceName))
context.Response.Clear();
if (fileExtension == "js")
context.Response.ContentType = "text/javascript";
else if (fileExtension == "css")
context.Response.ContentType = "text/css";
else if (fileExtension == "png")
context.Response.ContentType = "image/png";
Debug.Assert(stream != null, "stream != null");
stream.CopyTo(context.Response.OutputStream);
There's another property for selectors: sf-template-assembly
So the way to get this to work, from my experiementation, is:
<
sf-collection
sf-data
=
"items"
sf-model
=
""
sf-multiselect
=
"true"
sf-identifier
=
"Generic Selector Example"
sf-deselectable
=
"true"
sf-template-assembly
=
"[Assembly Name]"
sf-template-url
=
"[Folder Path To Resource Inside Assembly]/SfCollectionTemplate.html"
></
sf-collection
>
Here's a working example:
Assembly Name: ListWidget
Path to Embedded Resource: MVC/Views/List/SfCollectionTemplate.html
<
sf-collection
sf-data
=
"items"
sf-model
=
""
sf-multiselect
=
"true"
sf-identifier
=
"Generic Selector Example"
sf-deselectable
=
"true"
sf-template-assembly
=
"ListWidget"
sf-template-url
=
"MVC/Views/List/SfCollectionTemplate.html"
></
sf-collection
>