MgSoftDev.KnowledgeHub.Templating
1.0.0
dotnet add package MgSoftDev.KnowledgeHub.Templating --version 1.0.0
NuGet\Install-Package MgSoftDev.KnowledgeHub.Templating -Version 1.0.0
<PackageReference Include="MgSoftDev.KnowledgeHub.Templating" Version="1.0.0" />
<PackageVersion Include="MgSoftDev.KnowledgeHub.Templating" Version="1.0.0" />
<PackageReference Include="MgSoftDev.KnowledgeHub.Templating" />
paket add MgSoftDev.KnowledgeHub.Templating --version 1.0.0
#r "nuget: MgSoftDev.KnowledgeHub.Templating, 1.0.0"
#:package MgSoftDev.KnowledgeHub.Templating@1.0.0
#addin nuget:?package=MgSoftDev.KnowledgeHub.Templating&version=1.0.0
#tool nuget:?package=MgSoftDev.KnowledgeHub.Templating&version=1.0.0
MgSoftDev.KnowledgeHub.Templating
Datos vivos en las páginas de MgSoftDev.KnowledgeHub, sobre Scriban.
Para la documentación que miente porque nadie se acuerda de actualizarla: la lista de roles del sistema, los equipos de planta con su IP y su PLC, bloques que solo debe ver quien tenga cierto rol. La página se rellena sola al abrirse.
Registro
services.AddKnowledgeHubTemplating();
Regístralo donde corre el core, el mismo contenedor que AddKnowledgeHubCore. En WASM va en el
servidor de la API: el navegador recibe la página ya renderizada y Scriban nunca se compila a
WebAssembly. Sin registrarlo, las páginas marcadas muestran sus llaves tal cual.
Scriban es BSD-2 y en net8.0+ entra con cero dependencias transitivas.
Lo que hay sin escribir una línea
| Expresión | Qué da |
|---|---|
{{ kh.roles }} |
El catálogo de roles que tu app ya le pasa a la librería |
{{ kh.user.has "Role.X" }} |
Si quien lee tiene ese permiso |
{{ kh.user.name }} · .display_name · .permissions |
Quién está leyendo |
{{ kh.page.title }} · .slug · .pk |
La página |
{{ kh.is_pdf }} |
Verdadero solo al exportar |
<ul>{{ for r in kh.roles }}<li>{{ r.display_name }}</li>{{ end }}</ul>
{{ if !kh.is_pdf }}<p>Esto no sale en el manual impreso.</p>{{ end }}
Tus propios datos
public sealed class EquiposProvider : IKnowledgeHubTemplateModelProvider
{
public string Name => "equipos"; // {{ for e in equipos }}
public TemplateModelInfoDto Describe() => new() { Name = Name, Description = "Equipos de planta" };
public async Task<object?> GetModelAsync(TemplateModelContext ctx) =>
await _db.Equipos
.Select(e => new { e.Linea, e.Pc, e.Ip, e.Plc }) // proyecta: NO devuelvas la entidad
.ToListAsync(ctx.CancellationToken);
}
services.AddScoped<IKnowledgeHubTemplateModelProvider, EquiposProvider>();
⚠️ No devuelvas objetos ricos. Una plantilla puede leer todas las propiedades públicas de lo que le entregues, recursivamente: una entidad de EF arrastra sus navegaciones, y un
DbContexto unHttpContextexponen muchísimo más de lo que pretendías.
Se llama en cada vista de una página que lo use — de eso va la feature. Si tu fuente es cara, cachea dentro de tu proveedor, que es donde se conoce el coste.
Opt-in por página, y con permiso propio
Una página solo se procesa si está marcada en Gestionar página, y marcarla exige
KnowledgeHub.Templates — el único permiso de la librería sin modo grueso: tener Edit no
basta. Escribir una plantilla recorre datos del anfitrión y ejecuta bucles en el servidor, en cada
visita, para cada lector.
Lo demás se queda intacto: una página que documente Angular o Handlebars conserva sus llaves.
Seguridad y límites
- La salida renderizada se sanea con el
IKnowledgeHubHtmlSanitizerregistrado. Scriban no escapa nada, así que sin saneador un dato con<script>entraría crudo. - Contexto endurecido: sin
includeniobject.eval,LoopLimit500,RecursiveLimit20, tope de salida y timeout de 2 s por render. Todo configurable. - Publicar una plantilla rota se rechaza con la línea; guardar el borrador solo avisa.
- Un proveedor que falle cuesta su variable, nunca la página.
Limitaciones
- En atributos no funciona (
class="{{ x }}"): el saneador se lo lleva. Ponlo en el contenido. - La búsqueda indexa la plantilla, no el resultado.
- El historial no renderiza, a propósito: es la herramienta de auditoría.
Ver la guía §10.1 para el detalle completo.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- MgSoftDev.KnowledgeHub.Abstractions (>= 1.0.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.10)
- Scriban (>= 7.2.6)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 46 | 9/13/2026 |
| 0.23.0-preview.1 | 42 | 9/13/2026 |
| 0.22.0-preview.1 | 55 | 9/1/2026 |
| 0.21.0-preview.1 | 55 | 9/1/2026 |
| 0.20.0-preview.1 | 61 | 8/27/2026 |
| 0.19.4-preview.1 | 74 | 8/25/2026 |
| 0.19.3-preview.1 | 80 | 8/15/2026 |
| 0.19.2-preview.1 | 67 | 8/15/2026 |
| 0.19.1-preview.1 | 63 | 8/15/2026 |
| 0.19.0-preview.1 | 68 | 8/15/2026 |