2011-07-22 25 views
0

我有一個內嵌JavaScript的ASP.NET MVC應用程序,它只適用於特定的視圖。將JavaScript用於視圖的外部化

如果我把所有的JavaScript主要佈局網頁時,收到錯誤消息的所有網頁上存在不ID。

是否有一種方法可以將每個視圖的JavaScript外部化?

+1

下面的答案是正確的。但爲了完整性還有另一種選擇 - 在你的Javascript中檢查ID是否爲空。 – Daveo

回答

1

如果您使用的是MVC 2,則可以使用內容佔位符。

// this goes in your master page in your head tag 
<asp:ContentPlaceHolder id="Script" runat="server"/> 

// this goes in your view -- not partial 
<asp:Content ID="Content1" ContentPlaceHolderID="script" runat="server"> 
    <script type="text/javascript" src="foo.js"></script> 
</asp:Content> 

在MVC 3中,您可以做this

2

這是一種方法。在你佈局頁面之間的head標籤創建節

<head> 
@RenderSection("Head", required: false); 
</head> 

然後在視圖中創建一個部分,並把你的腳本標籤呢?這是使用Razor視圖引擎

@section Head 
{ 
    <script type="text/javascript"> 
     do some java script... 
    </script> 

} 

你也可以參考特定於該頁面外部庫,如燈箱或東西。

0

JavaScript可以測試'ID'是否爲空或未定義,如果是,則不觸發代碼。

1

我使用HtmlHelper擴展在每個控制器上註冊我的使用腳本 - 「動作」和「MasterPage」使用正確的腳本標記呈現每個註冊的腳本。

的HtmlHelper:

public static void RegisterScript(string path) 
    { 
     if (!HttpContext.Current.Items.Contains("RegisteredScripts")) 
      HttpContext.Current.Items.Add("RegisteredScripts", ";" + path); 
     else 
      HttpContext.Current.Items["RegisteredScripts"] = ";" + path; 
    } 

    public static MvcHtmlString RegisteredScripts(this HtmlHelper html) 
    { 
     var lines = new StringBuilder(); 
     if (html.ViewContext.HttpContext.Items.Contains("RegisteredScripts")) 
     { 
      foreach (var k in html.ViewContext.HttpContext.Items["RegisteredScripts"].ToString().Substring(1).Split(';')) 
      { 
       lines.Append(html.Script(k)); 
      } 
     } 

     return MvcHtmlString.Create(lines.ToString()); 
    } 

    // Helper-functions 
    public static MvcHtmlString Script(this HtmlHelper html, string path) 
    { 
     if (!ExistsInContext(html, path)) 
     { 
      return Render(html, "<script type=\"text/javascript\" src=\"{0}\"></script>", path); 
     } 
     return MvcHtmlString.Create(""); 
    } 
    private static bool ExistsInContext(HtmlHelper html, string path) 
    { 
     return html.ViewContext.HttpContext.Items.Contains(path); 
    } 

在控制器動作只要致電:

Helpers.HtmlHelpers.RegisterScript("~/Scripts/custom.js"); 

希望這有助於