fluid icon indicating copy to clipboard operation
fluid copied to clipboard

Allow Template selection to be context aware (ASP.NET DisplayMode)

Open SpeedyStuart opened this issue 3 years ago • 3 comments

Problem: I need to be able to use different liquid templates based on runtime information (cookie, user-agent, etc.). Similar to DisplayMode in ASP.NET.

Whilst it is possible to provide a custom File Provider which contains this logic and returns appropriate templates, the Template Cache in FluidViewRenderer just caches templates based on path - so renders my logic useless.

Possible change

  • Add a new delegate to FluidViewEngineOptions that takes the template path and returns a Template Cache key (string)
  • Use this delegate (if present) in GetFluidTemplateAsync to generate the key for each template in the Template Cache

e.g.

// Allow templates to be cached by external factors
// Typically the rule would match any rules in custom IFileProvider implementations
// e.g. Serve different templates based on Authentication status / User Agent etc.
string cacheKey = path;
if (_fluidViewEngineOptions.TemplateCacheKeyProvider!=null)
{
    cacheKey = _fluidViewEngineOptions.TemplateCacheKeyProvider.Invoke(path);
}

if (cache.TemplateCache.TryGetValue(cacheKey, out var template))
{
    return template;
}

template = await ParseLiquidFileAsync(path, fileProvider, includeViewStarts);

cache.TemplateCache[cacheKey] = template;

return template;

SpeedyStuart avatar Feb 01 '22 17:02 SpeedyStuart

Looks like a CMS feature ;) we have the same thing in Orchard.

Are you using the FluidMvcViewEngine engine or just the FluidViewEngine ?

sebastienros avatar Feb 01 '22 17:02 sebastienros

Ah, ok.

The Mvc one.

SpeedyStuart avatar Feb 01 '22 17:02 SpeedyStuart

Created pull request #486 for this

SpeedyStuart avatar Apr 05 '22 07:04 SpeedyStuart