2008-11-26 31 views
10

Tôi đã cố gắng sử dụng ASP.NET MVC trong một thời gian, sau đó tôi phải đối mặt với một vấn đề mà tôi không muốn bao gồm tất cả các js và css của tôi trong trang chủ. Nhưng làm thế nào tôi có thể đăng ký nó trong phần đầu của trang chủ từ quan điểm cụ thể của tôi?Trình trợ giúp đăng ký Script & CSS trong ASP.NET MVC?

Trả lời

10

Mẫu trang chính mặc định bao gồm Nội dung cấp địa chỉ cho đầu. Nếu nó không bạn có thể dễ dàng thêm một:

<head runat="server"> 
    <title></title> 
    <asp:ContentPlaceHolder ID="head" runat="server" /> 
</head> 

quan điểm của bạn sau đó có thể đặt bất cứ điều gì họ muốn trong đầu:

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 
    <script src="Scripts/myScripts.js" type="text/javascript"></script> 
    <link href="Styles/myStyles.css" rel="stylesheet" type="text/css" /> 
</asp:Content> 
+0

Không phải là câu hỏi này về ASP.NET MVC và không phải là hình thức web? –

+0

Công cụ xem dao cạo đã được phát hành với MVC 3. Đó là * phiên bản 3 *, như trong hai phiên bản toàn bộ sản phẩm đã được phát hành trước khi Razor được phát triển/bao gồm. Trước Razor, công cụ xem mặc định là ASPX. – sliderhouserules

0

về mặt kỹ thuật, bạn nên đặt tất cả các js ở cuối trang để có hiệu suất tốt nhất.

Tôi nghĩ rằng cách duy nhất bạn có thể làm điều này mặc dù sẽ bao gồm javascript trong VIewData và có ViewData được hiển thị trên trang chủ (không phải là một giải pháp tuyệt vời).

5

Nó không giống như có một lựa chọn đơn giản 'built- trong khuôn khổ ASP.NET MVC chưa. Nếu bạn đang sử dụng điều khiển người dùng (.ascx), có thể bạn đang tạo các điều khiển tự chứa cũng muốn quản lý các yêu cầu JavaScript của riêng mình, thì bạn thậm chí không thể sử dụng trình giữ chỗ để giúp bạn.

Cuối cùng tôi đã tạo ra một lớp helper và trong đó có một vài phương pháp:

private static SortedList<int, string> GetRegisteredScriptIncludes() 
{ 
    var registeredScriptIncludes = System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] as SortedList<int, string>; 

    if (registeredScriptIncludes == null) 
    { 
     registeredScriptIncludes = new SortedList<int, string>(); 
     System.Web.HttpContext.Current.Items["RegisteredScriptIncludes"] = registeredScriptIncludes; 
    } 

    return registeredScriptIncludes; 
} 

public static void RegisterScriptInclude(this HtmlHelper htmlhelper, string script) 
{ 
    var registeredScriptIncludes = GetRegisteredScriptIncludes(); 
    if (!registeredScriptIncludes.ContainsValue(script)) 
    { 
     registeredScriptIncludes.Add(registeredScriptIncludes.Count, script); 
    } 
} 

public static string RenderScripts(this HtmlHelper htmlhelper) 
{ 
    var registeredScriptIncludes = GetRegisteredScriptIncludes(); 
    var scripts = new StringBuilder(); 
    foreach (string script in registeredScriptIncludes.Values) 
    { 
     scripts.AppendLine("<script src='" + script + "' type='text/javascript'></script>"); 
    } 
    return scripts.ToString(); 
} 

Đó là một hình thức cơ bản của nó anyway để thử và thấy cách nó hoạt động. Nó có thể được tăng cường bằng nhiều cách, nhưng tại thời điểm nó chỉ lọc ra các yêu cầu chèn kịch bản trùng lặp cho bạn. Bất cứ khi nào bạn muốn thêm một kịch bản mới trong ascx (hoặc aspx cho rằng vấn đề), bạn có thể làm theo cách này:

<% 
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/MapLayer.js")); 
    Html.RegisterScriptInclude(Url.Content("~/Scripts/MapLayers/Vehicles.js")); 
%> 

Sau đó, bạn cần phải nhớ để xuất chúng khi bạn đã hoàn tất. Điều này đạt được bằng cách thực hiện cuộc gọi sau tại địa điểm trong trang của bạn nơi bạn muốn xuất các thẻ tập lệnh:

<%=Html.RenderScripts() %> 

Dường như làm việc cho tôi. Tôi đã mong đợi một nửa để có vấn đề rendering tùy thuộc vào những gì điểm RenderScripts được gọi là, đặc biệt là nếu không phải tất cả các RegisterScriptIncludes đã được gọi được nêu ra, nhưng cho đến nay nó dường như làm công việc. Nếu bạn hoàn thành các tập lệnh thì bạn sẽ không gặp vấn đề gì.

4

@ Jason: CẢNH BÁO, bạn không nên sử dụng biến tĩnh như thế này ... Trong ngữ cảnh web, biến tĩnh được chia sẻ trên tất cả người dùng và tất cả yêu cầu trang. Tôi ngạc nhiên rằng bạn đã không gặp rắc rối với mã của bạn. Nguyên tắc là tốt nhưng mã là sai và sẽ cho bạn gặp rắc rối. Trong trường hợp này, bạn nên sử dụng System.Web.HttpContext.Current.Items. Xem http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx để biết thêm.

+0

Cảm ơn bạn đã trưởng thành - bạn học được điều gì đó mới mẻ mỗi ngày! Tôi đã thay đổi mã phù hợp với nhận xét của bạn. – Jason

+0

Thuộc tính tĩnh trong câu hỏi là một tham chiếu đến HttpContext.Items (cụ thể cho ngữ cảnh yêu cầu, mỗi liên kết của bạn, không phải là một biến thành viên tĩnh. Nó tương đối an toàn, trừ khi nhiều luồng được tạo thủ công để truy cập thành viên tĩnh này, trường hợp một khóa trên context.items hiện tại sẽ là thích hợp (tương tự cho từ điển, hoặc sử dụng ConcurrentDictionary). – Tracker1

0

MVC Futures hiện nay đã được xây dựng trong những người giúp đỡ cho việc này ...

1.<head> 
2. <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title> 
3. <%= Html.Css("BlueTheme/site.css") %> 
4. <%= Html.Script("jquery-1.3.2.js") %> 
5.</head> 

biết thêm thông tin ở đây: http://blog.osbornm.com/archive/2009/10/12/mvc-script-css-helpers.aspx

0

Mathew,

tôi đã xem xét blog của bạn trên Html.Css và Html.Script người giúp đỡ. Tôi không có ý là quan trọng nhưng tôi không thấy bất kỳ đề cập trong blog về cách Css và Script giúp giải quyết vấn đề được thảo luận ở đây. Vấn đề ở đây là một trong những yêu cầu tham chiếu kịch bản "đã đăng ký" tại bất kỳ điểm nào trong quá trình kết xuất và có thể nhiều lần (trong trường hợp mẫu hoặc xem một phần được sử dụng nhiều lần và đăng ký tập lệnh của riêng nó), và sau đó xuất ra các kết quả tổng hợp, sans trùng lặp, ở một vị trí duy nhất.

Nếu giải pháp của bạn giải quyết vấn đề này, vui lòng sửa tôi bằng cách làm rõ.

--Regards, Ken

Các vấn đề liên quan