我们有一个要转换为.NET Core的CMS。在我们的CMS中,我们可以添加页面和模板,包括CSS和Javascript模板。在页面上,我们可以选择应在该页面上加载的一个或多个CSS和/或Javascript模板。
要使其正常工作,我想在控制器(或服务)内部动态构建指向CSS或Javascript文件的URL,并将该文件添加至_Layout.cshtml。此刻我正在做这样的事情:
我的控制器方法:
public IActionResult Test()
{
var listOfCssIds = new List<int>() { 1, 2, 3 };
var cssFile = $"/css/customCss_{String.Join("_", listOfNumbers)}.css";
ViewData["MyCssFile"] = cssFile;
return View();
}
我的_Layout.cshtml
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
@{
if (@ViewData["MyCssFile"] != null)
{
<link href="@ViewData["MyCssFile"]" rel="stylesheet" />
}
}
</head>
<body>
<h1>Layout from library</h1>
@RenderBody()
</body>
</html>
我们还可以将指向外部CSS / Javascript文件的链接添加至CDN。我们也想将它们添加到我们的视图中。我可以使用与上面的代码相同的方式来执行此操作,但这感觉不对,我想知道是否有更好的方法可以执行此操作?
我考虑过使用节,然后将@RenderSection()
添加到我的_Layout.cshtml
中,但是我找不到如何通过控制器或服务向节中添加内容的方法,在另一种观点中做到这一点。
我一直在互联网上寻找答案/想法,但找不到任何东西。谁能告诉我这种情况下的最佳做法是什么?
我对HTML有相同的问题,我们的CMS决定了该页面应具有的大多数HTML。当前,我在控制器中构建了HTML,然后将其添加到ViewData
并将其放在我的视图中,如下所示:@Html.Raw(ViewData["Html"])
。我也想知道是否有更好的方法可以做到这一点?
答案 0 :(得分:2)
我假设所选的CSS文件由CMS通过数据库保留,而不是具有静态的CSS ID列表,实际上是从数据库中提取信息。在这种情况下,最好的选择是view component:
return SafeArea(
child: Scaffold(
...
现在,您实际上只是将id作为支持此视图组件的视图的模型传递。因此,继续在public class CustomCssViewComponent : ViewComponent
{
private readonly MyContext _context;
public CustomCssViewComponent(MyContext context)
{
_context = context;
}
public async Task<IViewComponentResult> InvokeAsync()
{
var ids = // pull in the ids from your context;
return View(ids);
}
}
上创建该视图:
Views/Shared/Components/CustomCss/Default.cshtml
最后,在您的布局中或您希望包含的任何位置:
@model List<int>
<link href="/css/customCss_@(String.Join("_", Model)).css" rel="stylesheet" />
冲洗并重复使用自定义JS。您可能可以用相同的方式处理自定义HTML,但也可以考虑使用custom tag helpers。