簡體   English   中英

Asp.Net Mvc - ContentPlaceHolder- Javascript

[英]Asp.Net Mvc - ContentPlaceHolder- Javascript

根據我的頁面,我希望更改javascript函數的內容。

示例:

母版

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

結果是一樣的。 我只發現第二個輸出更干凈。

為什么不簡單地在腳本標記之外的內容占位符中添加其他代碼?

所以,你會有類似的東西:

<head>
   <script type="text/javascript">
      // do some stuff
   </script>
   <asp:ContentPlaceHolder runat="server" id="someid" />
</head>
...

或者,您可以在頁面的早期收集數組中的函數,然后稍后執行它們,如下所示:

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

您可以使用RegisterClientScriptBlock 基本上,這可以創建腳本標記和代碼,同時為您提供更多的服務器端控制。 話雖如此,您需要與母版頁進行通信。 您可以將StringBuilder公開為Master Page的公共屬性:

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指令以訪問Master對象:

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

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>

理想情況下,您需要累積這些部分腳本,並將它們作為一個塊呈現在頁面末尾

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM