【问题标题】:Clean alternative for not being able to use sections inside a partial view?无法在局部视图中使用部分的清洁替代方案?
【发布时间】:2017-04-27 04:59:59
【问题描述】:

由于我们无法在局部视图中使用部分,那么包含仅局部视图所需的脚本的最简洁方法是什么?

我知道我可以在调用部分的页面中包含我的脚本部分,但如果我的部分包含我想在整个站点中重复使用的 Javascript 组件,那么在每个基本页面中包含自定义脚本是维护的噩梦。

考虑到不能在局部中使用 JS 是设计使然,我什至希望将局部用于包含 Javascript 组件的可重用视图是否正确?

【问题讨论】:

  • 你不想在包含页面或部分页面中使用它。你到底在找什么?
  • 我想在局部使用它,但你不能。
  • @KidCode for javascript 实际上最简单的方法是在每个页面中包含它(捆绑和缩小 ofc)。

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


【解决方案1】:

您可以通过例如使用 IOC 范围或 HttpContext Bag 向布局页面发出部分信号,表明它应该包含脚本。由布局页面读取。

唯一也是主要的问题是脚本只会在这个部分执行后才会出现在这个包中,然后很可能您的 html 头部部分已经在布局视图中关闭。所以它可以在页面底部添加脚本,但它不适用于 css。

更好的方法是创建自己的视图组件(或扩展它们)并选择指定必要的视图。 IOC 这些组件在顶部并在需要的地方渲染它们。

更好的解决方案

一个更好的解决方案是,如果有一半的页面需要这个 java 脚本来将它捆绑到主包中。缩小器可能能够缩小更多变量,并且用户将需要为正在加载的页面请求少 1 个脚本(http 请求),从而创建更少的流量,创建更快的页面加载,创造更好的用户体验。

【讨论】:

  • 我认为在将其捆绑并缩小到每一页方面,我和你一样。 - 对于临时脚本来说不是很好,但为了简单起见,这似乎是要走的路。
【解决方案2】:

我不会假装这是最佳的,但如果您不想创建自己的浏览页面扩展,您可以构建这样的东西:

public static class DeferredScripts
{
    static IList<string> paths = new List<string>();

    public static IList<string> Scripts { get; set; }

    public static void Add(string path)
    {
        if (Scripts == null)
        {
            Scripts = new List<string>();
        }

        if (!paths.Any(s => s.Equals(path, StringComparison.OrdinalIgnoreCase)))
        {
            var script = new TagBuilder("script");
            script.Attributes.Add("src", path);

            Scripts.Add(script.ToString());
            paths.Add(path);
        }
    }
}

然后您可以在局部视图中这样使用:

@{
    DeferredScripts.Add("/scripts/testscript1.js");
}

并在您的布局(或视图页面)中使用它:

@foreach (var script in DeferredScripts.Scripts)
{
    @Html.Raw(script)
}

似乎在我一起扔的测试项目中工作:https://github.com/tiesont/DeferredScriptsTestApp

Telerik 为他们的 KendoUI ASP.NET MVC 助手提供了类似的东西,尽管我认为他们的实现比我在这里展示的更强大。

【讨论】:

  • 很遗憾,我们不得不求助于这种 hack 来获得一些看似如此重要的东西,但我真的很喜欢你的工作。
【解决方案3】:

我认为这是公平但可能最没有帮助的答案是说“如果您想在部分中使用部分或模拟它,那么您使用 MVC6 是错误的”。

您的问题的理想解决方案主要有 3 种情况:

  1. Partial/ViewComponent添加0次,对应的JavaScript库添加0次
  2. Partial/ViewComponent被添加1次,对应的JavaScript库被添加1次,动态创建的初始化JavaScript被创建一次,放在库之后。
  3. Partial/ViewComponent被多次添加,对应的JavaScript库被添加1次,动态创建的初始化JavaScript为每个Partial/ViewComponent创建,都放在库之后。

三个主要选项是

  1. 添加&lt;hidden data-myTool-*="MyData"&gt; 并在页面底部有一个主脚本以将其全部读取(不理想,因为它违反了#1)
  2. 制作 DeferredScripts 工具(理想但引用外部类)
  3. 将字符串列表传递给部分以添加其脚本依赖项。 (理想但只能轻松使用非布局视图并假设部分不使用模型)

这是选项 3 的示例:

部分:

@model List<string>

FROM TEST PARTIAL
@{ Model.Add("Partial.js");}

查看:

@{
    var jsfiles = new List<string>();
    jsfiles.Add("View.js");
}
@Html.Partial("_Test", jsfiles)
@Html.Partial("_Test", jsfiles)
@Html.Partial("_Test", jsfiles)
@section scripts {
    @foreach (string file in jsfiles.Distinct().ToList())
    {
        <script src="@file"></script>
    }
}

结果:

<script src="View.js"></script>
<script src="Partial.js"></script>

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多