Asp.Net Mvc - ContentPlaceHolder- Javascript
В зависимости от того, на какой странице я нахожусь, я бы хотел, чтобы содержимое функции javascript менялось.
Пример:
MasterPage
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
</script>
Страница А
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</script>
Поскольку я не хочу делать повторение кода, я ищу решение. Я подумал, что, возможно, я мог бы использовать что-то вроде ContentPlaceHolder, как это (но это не работает):
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
<asp:ContentPlaceHolder id="cphJS" runat="server" />
</script>
Любой способ решить эту проблему?
ОБНОВИТЬ
Чего я хотел бы избежать, так это иметь такой код:
// Add by MasterPage
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
</script>
// Add by Page A
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</script>
// Add by Page B
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#main', { fontFamily: 'Helvetica95-Black' });
Cufon.replace('p#menu', { fontFamily: 'Helvetica95-Black' });
</script>
Потому что такой код работает, но это не чистый способ сделать это. Я бы предпочел иметь что-то подобное:
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
Cufon.replace('p#main', { fontFamily: 'Helvetica95-Black' });
Cufon.replace('p#menu', { fontFamily: 'Helvetica95-Black' });
</script>
Результат тот же. Я только нахожу, что второй выход чище.
5 ответов
Почему бы просто не добавить дополнительный код в заполнитель содержимого вне тега script?
Итак, у вас будет что-то вроде:
<head>
<script type="text/javascript">
// do some stuff
</script>
<asp:ContentPlaceHolder runat="server" id="someid" />
</head>
...
Или вы можете собрать функции в массиве в начале страницы, а затем выполнить их позже так:
В
:var callbacks = [];
function addCallback(arg) {
callbacks.push(arg);
}
В другом месте:
addCallback(function() {
...
});
А затем внизу страницы, перед body>:
for (var i = 0; i < callbacks.length; i++) {
var c = callbacks[i];
if (c && c instanceof Function)
c();
}
Не могли бы вы предоставить более подробную информацию о требованиях? Пример: что должен делать приведенный выше код, должен ли он выполняться все сразу, зависит ли он от создаваемых локальных переменных, должен ли он выполняться в определенное время и т. Д.
Изменить: Использование заполнителя контента в новом проекте MVC, казалось, хорошо для меня. Intellisense не поднял его, но отрисовал правильно. Вот как выглядит код для меня.
На главной странице:
...
<script type="text/javascript">
var inTheMasterPage;
<asp:ContentPlaceHolder runat="server" id="js1">
</asp:ContentPlaceHolder>
</script>
...
На странице:
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content runat="server" ContentPlaceHolderID="js1">
var inThePage;
</asp:Content>
...
И представленный HTML:
<script type="text/javascript">
var inTheMasterPage;
var inThePage;
</script>
</head>
ContentPlaceHolder - хорошая идея, вы просто пропустили ее и можете их переопределить
на главной странице
<asp:contentplaceholder id="scripts" runat="server" >
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
</script>
</asp:contentplaceholder>
на странице А
<asp:Content ID="scriptContent" ContentPlaceHolderID="scripts" runat="server">
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</script>
</asp:contentplaceholder>
контент со страницы переопределяет контент с главной страницы
если вы хотите добавить сценарии, тогда держите заполнитель содержимого на главной странице
<script type="text/javascript">
Cufon.now();
Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
<asp:ContentPlaceHolder id="cphJS" runat="server" />
</script>
на вашей странице А не ставьте теги сценария
<asp:Content ID="scriptContent" ContentPlaceHolderID="cphJS" runat="server">
Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</asp:contentplaceholder>
Вы можете использовать RegisterClientScriptBlock. По сути, это может создавать теги и код скрипта, предоставляя вам больше контроля на стороне сервера. С учетом сказанного вам нужно будет общаться с главной страницей. Вы можете выставить StringBuilder как открытое свойство главной страницы:
StringBuilder javascriptCode = new StringBuilder();
javascriptCode.Append("Cufon.now();" + System.Environment.NewLine);
javascriptCode.Append("Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });" + System.Environment.NewLine);
public StringBuilder JSCode
{
get { return javascriptCode; }
}
На странице содержимого вы добавляете директиву MasterType, чтобы получить доступ к главному объекту:
<%@ MasterType VirtualPath="~/virtualPath/nameOfMasterPage.page" %>
И на вашей контентной странице вы можете добавить больше кода JavaScript и вызвать RegisterClientScriptBlock:
Master.JSCode.Append("Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });" + System.Environment.NewLine);
ClientScriptManager clientScript = Page.ClientScript;
clientScript.RegisterClientScriptBlock(this.Page.GetType(), "MadeUpNameForJSScript", Master.JSCode.ToString(), true);
Я не проверял этот код, поэтому дайте мне знать, если есть какие-либо проблемы с ним. Это может быть немного неудобный метод, но он должен объединить весь JavaScript в один блок скрипта на странице.
Редактировать: я также не знаю, будет ли это работать с MVC
В идеале вам нужно собрать эти частичные сценарии и отобразить их как один блок в конце страницы.
Не уверен на 100%, как это сделать в MVC, но вот пример для простого ASP.NET, который вы должны иметь возможность вставить в MVC
Одна из прелестей селекторов в том, что объект не должен существовать на странице. Вы также можете поставить несколько селекторов для Cufon в один удар...
Так что, если вы разместите это на главной странице, это должно сработать...
<script type="text/javascript">
Cufon.now();
Cufon('p#characters, p#others, p#main, p#menu', { fontFamily: 'Helvetica95-Black' });
</script>