Asp.Net Mvc - ContentPlaceHolder- Javascript - PullRequest
       6

Asp.Net Mvc - ContentPlaceHolder- Javascript

2 голосов
/ 09 февраля 2010

В зависимости от того, на какой я странице, я бы хотел, чтобы содержимое функции javascript менялось.

Пример:

MasterPage

<script type="text/javascript">
    Cufon.now();
    Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
</script>

Страница A

<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>

Есть ли способ решить эту проблему?

UPDATE

Чего я хотел бы избежать, так это иметь такой код:

// 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 ]

5 голосов
/ 09 февраля 2010

Почему бы просто не добавить дополнительный код в заполнитель содержимого вне тега 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() {
   ...
});

А затем внизу страницы, прямо перед :

for (var i = 0; i < callbacks.length; i++) {
   var c = callbacks[i];
   if (c && c instanceof Function)
      c();
}

Не могли бы вы предоставить более подробную информацию о требованиях? Пример: что должен делать приведенный выше код, должен ли он выполняться все сразу, зависит ли он от создаваемых локальных переменных, должен ли он выполняться в определенное время и т. Д.

Edit: Использование заполнителя контента в новом проекте 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> 
2 голосов
/ 17 февраля 2010

ContentPlaceHolder - хорошая идея, вы просто неправильно ее определили также вы можете переопределить их

на главной странице

<asp:contentplaceholder id="scripts" runat="server" >
   <script type="text/javascript">
       Cufon.now();
       Cufon.replace('p#characters', { fontFamily: 'Helvetica95-Black' });
   </script>
</asp:contentplaceholder>

на странице A

<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>

на вашей странице A не помещайте теги сценария

<asp:Content ID="scriptContent" ContentPlaceHolderID="cphJS" runat="server">
        Cufon.replace('p#others', { fontFamily: 'Helvetica95-Black' });
</asp:contentplaceholder>
2 голосов
/ 13 февраля 2010

Вы можете использовать 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

1 голос
/ 16 февраля 2010

Одна из прелестей селекторов в том, что объект не должен существовать на странице. Вы также можете поставить несколько селекторов для Cufon одним ударом ...

Так что, если вы поместите это в свою главную страницу, оно должно просто работать ...

<script type="text/javascript">
    Cufon.now();        
    Cufon('p#characters, p#others, p#main, p#menu', { fontFamily: 'Helvetica95-Black' });
</script>
1 голос
/ 12 февраля 2010

В идеале вам необходимо собрать эти частичные сценарии и отобразить их как один блок в конце страницы

Не уверен на 100%, как это сделать в MVC, но вот пример для простого ASP.NET , что вы должны иметь возможность вставить в MVC

...