【问题标题】:EditorTemplate rendered multiple times, script rendered onceEditorTemplate 渲染多次,脚本渲染一次
【发布时间】:2014-06-06 21:22:28
【问题描述】:

我使用 ASP.NET MVC(没有 Razor 引擎)。我有一个 EditorTemplate 需要一个脚本才能正常工作。我可以将脚本放在用户控件中,但我不希望在页面中多次出现 EditorTemplate 时多次定义此脚本。

我也不想将脚本放在页面中,因为这将是消费者(页面)无法轻易知道的依赖项。从长远来看,这是一个错误的秘诀。

我认为解决方案是将这段代码放在 ascx 中:

<% if (RequestState.IsEditorScriptRendered == null) { %>
    RequestState.IsEditorScriptRendered = true;
    <script>...</script>
<% } %>

不幸的是,似乎没有任何状态具有请求生命周期。如何存储“IsEditorScriptRendered”信息?有没有更好的方法来达到我想要的结果?

【问题讨论】:

  • 来自 nuget 的 ASP.NET MVC 5.1.2,这是最新版本。

标签: c# asp.net asp.net-mvc-5 mvc-editor-templates .net-4.5


【解决方案1】:

我使用了特定于脚本的 my own answer to How to render a Section in a Partial View in MVC3 预捆绑包。

使用捆绑包,将我的所有编辑器模板 JS 文件包含在一个捆绑包中会更便宜。

【讨论】:

  • 我看到您正在使用 ViewContext.HttpContext.Items 来存储哪些脚本已经被渲染。我不知道这个数据存储。这正是我要找的!
  • 它是每个 HttpContext(请求)的唯一支持数据存储。
【解决方案2】:

您可以将您的 javascript 代码放入 .js 文件并从您的页面中引用它。然后您可以从所有编辑器模板中调用它。

【讨论】:

  • 不会多次加载文件?它在页面就绪时包含一个事件处理程序,我不想多次调用它。
  • 如果您在 master 中引用它 - 每页只会加载一次。
  • 只有几页需要。将它添加到应用程序中的每个页面都太过分了。
  • 是参考,不是js代码。 js 文件由浏览器缓存,因此它们不会在每个请求上加载。
【解决方案3】:

您使用的语言让我相信您正在像 Webforms 一样处理这个问题。 (用户控制,具有请求生命周期的状态)。无论如何,您能解释一下为什么您的页面不能轻易了解依赖关系吗?在 ASP.NET MVC 中,作为作者,通常您知道您的依赖项并将它们放在一个 Bundle 和/或母版页中。

我建议只为包含特定脚本的少数需要它的页面创建一个单独的包或单独的母版页。您不仅限于一个网站范围的母版页。

无论如何,脚本都会被缓存,因此最多只能下载一次。 (我并不是说不要调整,而是跳过箍以避免包含脚本通常是过早的优化)。

【讨论】:

  • 我不介意脚本加载。这是我不想多次注册的事件处理程序。但是你让我觉得我可以判断脚本是否已经在 javascript 中加载,而不是试图阻止它的呈现。
  • 至于已知的依赖关系,我正在编写的编辑器模板可以在几个页面中使用,它注册了一个“页面加载”事件处理程序。如果不在其他每个页面中注册无用的事件处理程序,我就无法将它放在母版页中。我也不希望页面需要添加它,因为我认为页面应该能够使用“Html.EditorFor”,而无需确切知道将使用哪个编辑器模板以及它具有哪些依赖项。但我可能想多了……
  • 您的编辑器模板中可以包含条件 Javascript。你可以渲染任何你喜欢的东西。这能解决你的问题吗?
  • 当我看到 Erik 的更优雅的解决方案时,我正试图将事件注册代码包装在 javascript 条件中。我认为它也会起作用。
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 2019-12-24
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2021-12-01
相关资源
最近更新 更多