【发布时间】:2017-01-10 17:52:40
【问题描述】:
在 ASP.NET Core 应用程序中,我有一个带有小部件的仪表板。每个小部件都有自己的 PartialViews,所以整个页面的生成方式如下:
-Layout.cshtml
--Dashboard.cshtml
--- Widget1.cshtml
--- Widget2.cshtml
根据快速页面加载时间的最佳实践,JavaScript 在 Layout.cshtml 中的关闭 </body> 标记之前加载。之后,有一个自定义 JS 部分,我通常使用它来在页面加载时启动对象。所以这部分看起来像这样:
<script asp-append-version="true" type="text/javascript" src="~/clientscript/page.min.js"></script>
@RenderSection("Js", required: false)
在我的视图中,使用 Layout.cshtml 作为布局(在这个例子中,它的 Dashboard.cshtml),我可以定义一个类似的部分
@section Js {
// Js Code here
}
在包含所有脚本文件的脚本标记之后呈现。所以我可以肯定,像 jQuery 或自定义类这样的所有依赖项都可以在这里使用。
但是例如,我还需要在像 Widget1.cshtml 这样的小部件中执行此操作。问题是:我在 Dashboard.cshtml 中加载了 PartialView Widget1.cshtml。在documentation is written,这是不可能的:
如果您在局部视图中声明 Razor 部分,则其父级将看不到它;它将仅限于部分视图。
但这正是我所需要的。有没有办法解决这个限制?很快,我们的目标就是将 JavaScript 从 PartialView 注入到 LayoutView 中,在它们之间有一个常规的 View。
我知道的唯一方法是使用 setInterval() 以像 50 毫秒这样的低间隔,并在那里检查 jQuery 或我的一些自定义类是否在循环中定义,直到它们被定义。它是一个 JS 解决方案。但是它可以直接在 PartialView 中包含脚本块而不使用部分。当您依赖像 jQuery 这样的单个变量时,它非常适合。
但我需要等待自定义类被加载。它们包含在 jQuery 之后。所以编写像waitForTypeLoaded(type, callback) 这样的通用函数是不可能的。这会导致我总是编写原始的 setInterval() 代码,这对我来说似乎不是一个聪明的解决方案。
【问题讨论】:
-
也许我误解了您的需求,但部分视图仍然可以访问父级呈现的资产(如 css、js 等)。你是说你想在
widget1.cshtml中运行一个脚本,但是还没有渲染支持脚本吗?如果是这种情况,你需要编写一个 js 事件来让你知道它何时加载。
标签: javascript jquery asp.net-core asp.net-core-mvc asp.net-core-1.0