У меня есть представление с использованием главной страницы, содержащей некоторый javascript, который необходимо выполнить с помощью OnLoad Body. Как лучше всего установить OnLoad на моей MasterPage только для определенных представлений?
По идее, я пытался передать имя функции javascript как ViewData. Но я действительно не хочу, чтобы мои контроллеры знали о javascript на странице. Мне такой подход очень не нравится ...
<body onload = "<%=ViewData["Body_OnLoad"]%>">
<asp:ContentPlaceHolder ID = "MainContent" runat = "server" />
Изменить - я полагаю, что одна из идей - использовать вместо этого событие готовности документа jQuery ...
Есть другие идеи?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В любом случае вам определенно следует использовать jQuery или другой фреймворк JavaScript.
Пусть ваши контроллеры передают вашим представлениям какой-то индикатор состояния, но не специфичные для представлений вещи, такие как имена функций JavaScript. Сопоставление индикаторов состояния с именами функций JavaScript зависит от ваших представлений.
Я использовал следующий шаблон со своим текущим проектом MVC, и, похоже, он пока неплохо работает для моей работы с .js ...
На своей главной странице я загружаю свои стандартные файлы сценариев, которые хочу использовать на всех моих страницах с контентом (например, jquery.js, global.js, jquery-plugins, файлы .css и т. д.). Затем я определяю все необходимые события на моей главной странице (onLoad, onSave и т. д.). Каждая страница содержимого, которую я создаю, будет иметь свой собственный файл .js, связанный с ней, и я загружаю этот файл сценария на страницу содержимого .aspx. Любые события .js, которые необходимо реализовать по-разному между страницами содержимого, обрабатываются в отдельном файле содержимого .js. Так что в основном моя главная страница имеет набор функций .js, которые будут реализовывать мои сценарии страницы содержимого. Прямо сейчас я просто сохраняю эти сигнатуры функций шаблона .js в файле, копирую и вставляю их в каждый новый файл content.js, который мне нужно создать. Тем не менее, я думаю о создании генератора кода или инструмента, который будет выдавать эти сигнатуры шаблонов для меня в любом новом файле .js, который мне нужен (если .js имеет некоторую форму интерфейса или функции наследования, дайте мне знать).
Итак, чтобы резюмировать:
MasterPage.Master Загружает: jquery.js, global.js, plugins.js
ContentPage Loads: ContentPage.js
Global.js содержит функции, вызываемые главной страницей, которые не меняются между страницами содержимого, наряду с любыми другими глобальными обычными функциями.
Каждый ContentPage.js реализует свои собственные функции для страницы содержимого вместе с теми функциями, которые вызывает главная страница и которые имеют различное поведение.
Теперь, когда JQuery официально является частью ASP.NET MVC, я бы рекомендовал его использовать. Он небольшой и добавляет значимости вашему приложению.
Я бы порекомендовал добавить версию JQuery Мустафы, в которую включены комментарии Intellisense:
Затем добавьте его в папку Scripts (новое в MVC Beta 1) и укажите в нем ссылку следующим образом:
<script language = "javascript" type = "text/javascript" src = "../../Scripts/jquery-1.2.6-intellisense.js"></script>
Теперь вы можете добавить в свой код такую функцию:
$(document).ready(function() {
// do stuff when DOM is ready
});
Поскольку вы упомянули, что хотите, чтобы это происходило только в определенных представлениях, вы можете добавить заполнитель на своей главной странице следующим образом:
<asp:contentplaceholder id = "JavascriptPlaceholder" runat = "server"></asp:contentplaceholder>
Затем в вашем представлении вы можете выбрать, вставлять ли туда код или нет.
который войдет в раздел головы
Решение из блога: Использование body onload с ASP.net 2.0 MasterPages
MasterPage.master
<head>
<asp:ContentPlaceHolder runat = "server" id = "Headers">
</asp:ContentPlaceHolder>
<script language=javascript>
function mp_onload() {
if (window.body_onload != null)
window.body_onload();
}
</script>
</head>
<body onload = "mp_onload();">
Default.aspx
<asp:Content ID = "Content2" ContentPlaceHolderID = "Headers" Runat = "Server">
<script language = "javascript">
function body_onload()
{
//do something
}
</script>
</asp:Content>
Спасибо за ваше предложение. Я просто могу поиграться с этой идеей. Если вы когда-нибудь создадите инструмент или генератор, обязательно разместите его здесь!