EditorTemplate отображается несколько раз, сценарий отображается один раз

Я использую ASP.NET MVC (без движка Razor). У меня есть EditorTemplate, для правильной работы которого требуется скрипт. Я мог бы просто поместить сценарий в пользовательский элемент управления, но я не хочу, чтобы этот сценарий определялся несколько раз, когда EditorTemplate несколько раз присутствует на странице.

Я также не хочу размещать скрипт на странице, потому что это будет зависимостью, о которой потребитель (страница) не может легко узнать. Это рецепт ошибок в долгосрочной перспективе.

Я думаю, что решением было бы поместить этот код в ascx:

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

К сожалению, похоже, что нет никакого состояния с временем жизни запроса. Как я могу сохранить информацию «IsEditorScriptRendered»? Есть ли лучший способ достичь желаемого результата?


person Kevin Coulombe    schedule 06.06.2014    source источник
comment
ASP.NET MVC 5.1.2 от nuget, которая является последней версией.   -  person Kevin Coulombe    schedule 07.06.2014


Ответы (3)


Предварительные пакеты, которые я использовал, собственный ответ на вопрос Как отобразить раздел в частичном представлении в MVC3, относящийся к сценариям.

С пакетами дешевле просто включить все JS-файлы моего шаблона редактора в один пакет.

person Erik Philips    schedule 06.06.2014
comment
Я вижу, вы используете ViewContext.HttpContext.Items для хранения уже обработанных сценариев. Я не знал об этом хранилище данных. Это именно то, что я ищу! - person Kevin Coulombe; 07.06.2014
comment
Это единственное поддерживаемое хранилище данных для каждого HttpContext (запроса). - person Erik Philips; 07.06.2014

Вы можете поместить свой код javascript в файл .js и ссылаться на него со своей страницы. Затем вы можете вызывать его из всех шаблонов редактора.

person Kirill Bestemyanov    schedule 06.06.2014
comment
Он не будет загружать файл несколько раз? Он включает обработчик событий на странице готовности, который я не хочу вызывать несколько раз. - person Kevin Coulombe; 07.06.2014
comment
Если вы ссылаетесь на него в мастере, он будет загружаться только один раз на страницу. - person Kirill Bestemyanov; 07.06.2014
comment
Он нужен только на нескольких страницах. Добавлять его на каждую страницу приложения было бы излишним. - person Kevin Coulombe; 07.06.2014
comment
это ссылка, а не код js. js кэшируются браузером, поэтому они не будут загружаться при каждом запросе. - person Kirill Bestemyanov; 07.06.2014

Язык, который вы используете, заставляет меня поверить, что вы подходите к этому как к веб-формам. (Пользовательский контроль, состояние со временем жизни запроса). В любом случае, можете ли вы объяснить, почему ваша страница не может легко узнать о зависимости? В ASP.NET MVC обычно вы, как автор, знаете свои зависимости и помещаете их в Bundle и/или на главную страницу.

Я рекомендую просто создать отдельный пакет или отдельную главную страницу для тех нескольких страниц, которые нуждаются в этом конкретном скрипте. Вы не ограничены только одной главной страницей сайта.

Несмотря на это, скрипты кэшируются, поэтому они будут загружены не более одного раза. (Я не говорю, что не нужно настраивать, но прыгать через обручи, чтобы избежать включения скрипта, обычно является преждевременной оптимизацией).

person codenheim    schedule 06.06.2014
comment
Я не против загрузки скрипта. Это обработчики событий, которые я не хочу регистрировать несколько раз. Но вы только что заставили меня думать, что я могу определить, был ли скрипт уже загружен в javascript, вместо того, чтобы пытаться предотвратить его рендеринг. - person Kevin Coulombe; 07.06.2014
comment
Что касается известных зависимостей, шаблон редактора, который я пишу, можно использовать на нескольких страницах, и он регистрирует обработчик событий загрузки страницы. Я не могу поместить его на главную страницу без регистрации бесполезных обработчиков событий на каждой второй странице. Я также не хочу, чтобы страница добавляла его, потому что я думаю, что страница должна иметь возможность использовать Html.EditorFor, не зная точно, какой шаблон редактора будет использоваться и какие у него зависимости. Но может я и преувеличиваю... - person Kevin Coulombe; 07.06.2014
comment
В вашем шаблоне редактора может быть условный Javascript. Вы можете визуализировать все, что вам нравится. Это решит вашу проблему? - person codenheim; 07.06.2014
comment
Я пытался обернуть код регистрации события в условие javascript, когда увидел более элегантное решение Эрика. Я тоже думаю, что это сработало бы. - person Kevin Coulombe; 07.06.2014