如何在ASP.NET Core中动态添加指向CSS和Javascript文件的链接

时间:2019-01-10 14:41:02

标签: asp.net-mvc asp.net-core

我们有一个要转换为.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"])。我也想知道是否有更好的方法可以做到这一点?

1 个答案:

答案 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