2012-03-01 8 views
13

Tôi đã thử tính năng rút gọn và đóng gói mới trong ASP.NET MVC 4 và nó hoạt động tuyệt vời miễn là bạn sử dụng các quy ước thư mục mặc định cho các tệp css và js.ASP.NET Optimization - Bundling

/Content 
/Scripts 

Tôi thường đặt css và kịch bản trong một thư mục có tên tĩnh như thế này

/Static/Css 
/Static/Js 

Tôi cố gắng để đăng ký gói của riêng tôi như thế này:

public static class BundleCollectionExtensions 
{ 
    public static void RegisterScriptsAndCss(this BundleCollection bundles) 
    { 
     var bootstrapCss = new Bundle("~/Static/Css", new CssMinify()); 
     bootstrapCss.AddDirectory("~/Static/Css", "*.css"); 
     bootstrapCss.AddFile("~/Static/Css/MvcValidation.css"); 
     bootstrapCss.AddFile("~/Static/Css/bootstrap-responsive.min.css"); 
     bootstrapCss.AddFile("~/Static/Css/bootstrap.min.css"); 

     bundles.Add(bootstrapCss); 

     var bootstrapJs = new Bundle("~/Static/Js", new JsMinify()); 
     bootstrapJs.AddDirectory("~/Static/Js", "*.js"); 
     bootstrapJs.AddFile("~/Static/Js/jquery-1.7.1.min.js"); 
     bootstrapJs.AddFile("~/Static/Js/jquery.validate.min.js"); 
     bootstrapJs.AddFile("~/Static/Js/jquery.validate.unobtrusive.min.js"); 
     bootstrapJs.AddFile("~/Static/Js/bootstrap.min.js"); 
     bootstrapJs.AddFile("~/Static/Js/gunsforhire.js"); 

     bundles.Add(bootstrapJs); 
    } 
} 

Và trong

Global.ascx.cs 

Tôi đã làm điều này:

BundleTable.Bundles.RegisterScriptsAndCss(); 

Các đánh dấu được tạo ra trông như thế này:

<link href="/Static/Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41" rel="stylesheet" type="text/css" /> 

<script src="/Static/Js?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1" type="text/javascript"></script> 

Tuy nhiên Nó không làm việc, yêu cầu trông như thế này:

Request URL:http://localhost:49603/Static/Js?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1 
Request Method:GET 
Status Code:301 Moved Permanently (from cache) 
Query String Parametersview URL encoded 
v:mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1 

Request URL:http://localhost:49603/Static/Js/?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1 
Request Method:GET 
Status Code:404 Not Found 
Request Headersview source 
Accept:*/* 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Connection:keep-alive 
Host:localhost:49603 
Referer:http://localhost:49603/ 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko)  Chrome/17.0.963.56 Safari/535.11 
Query String Parametersview URL encoded 
v:mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1 
Response Headersview source 
Cache-Control:private 
Content-Length:4757 
Content-Type:text/html; charset=utf-8 
Date:Thu, 01 Mar 2012 19:05:44 GMT 
Server:Microsoft-IIS/7.5 
X-Powered-By:ASP.NET 
X-SourceFiles:=?UTF-8?B? QzpcQENvZGVccGVsbGVccGVsbGVoZW5yaWtzc29uLnNlXHNyY1xXZWJcU3RhdGljXEpzXA==?= 

Tôi đang làm gì sai?

Cập nhật

Tôi nghĩ rằng cuối cùng tôi đã có thể giải quyết điều này bằng cách làm như sau:

  1. Loại bỏ các AddDirectory gọi bootstrapCss.AddDirectory("~/Static/Css", "*.css");

  2. Cho các đường dẫn bó mà không phản ánh cấu trúc thư mục thực

+1

Bạn có ý gì với số 2 "Cho phép các đường đi gói không phản ánh cấu trúc thư mục thực"? – CallMeLaNN

+0

Nếu bạn có cấu trúc thư mục như thế này/script/app, bạn không nên sử dụng đường dẫn đó trong gói ("~/ít nhất là tôi đã có một số vấn đề làm điều đó trong mvc 4 rc. đó không còn là vấn đề nữa. – Pelle

+0

Xin chào, bạn có bất kỳ manh mối nào mà không gian tên tôi bị thiếu không? tôi không nhận được Addfile hoặc AddDirectory trong bootstrapcss. ? – Sakthivel

Trả lời

4

nếu thực hiện điều này một vài ngày trước và nó hoạt động tốt. tôi đã tạo một thư mục có tên là Helper và sau đó tôi đã tạo một lớp mới có tên là CssJsBuilder.

lớp học của tôi trông như thế này:

public static void Initializing() 
{ 
    IBundleTransform jstransformer; 
    IBundleTransform csstransformer; 

#if DEBUG 
      jstransformer = new NoTransform("text/javascript"); 
      csstransformer = new NoTransform("text/css"); 
#else 
     jstransformer = new JsMinify(); 
     csstransformer = new CssMinify(); 
#endif 

      var bundle = new Bundle("~/Scripts/js", jstransformer); 

      bundle.AddFile("~/Scripts/jquery-1.6.2.js", true); 
      bundle.AddFile("~/Scripts/jquery-ui-1.8.11.js", true); 
      bundle.AddFile("~/Scripts/jquery.validate.unobtrusive.js", true); 
      bundle.AddFile("~/Scripts/jquery.unobtrusive-ajax.js", true); 
      bundle.AddFile("~/Scripts/jquery.validate.js", true); 
      bundle.AddFile("~/Scripts/modernizr-2.0.6-development-only.js", true); 
      bundle.AddFile("~/Scripts/AjaxLogin.js", true); 
      bundle.AddFile("~/Scripts/knockout-2.0.0.debug.js", true); 
      bundle.AddFile("~/Scripts/bootstrap.js", true); 
      bundle.AddFile("~/Scripts/dungeon.custom.js", true); 

      BundleTable.Bundles.Add(bundle); 

      bundle = new Bundle("~/Content/css", csstransformer); 

      bundle.AddFile("~/Content/bootstrap-responsive.css", true); 
      bundle.AddFile("~/Content/bootstrap.css", true); 

      BundleTable.Bundles.Add(bundle); 

      bundle = new Bundle("~/Content/themes/base/css", csstransformer); 

      bundle.AddFile("~/Content/themes/base/jquery.ui.core.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.resizable.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.selectable.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.accordion.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.autocomplete.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.button.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.dialog.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.slider.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.tabs.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.datepicker.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.progressbar.css", true); 
      bundle.AddFile("~/Content/themes/base/jquery.ui.theme.css", true); 

      BundleTable.Bundles.Add(bundle); 
     } 

Sau đó. Tới Global.asax:

  1. Remove hoặc nhận xét ra BundleTable.Bundles.RegisterTemplateBundles()
  2. Thêm CssJsBuilder.Initializing() Phương pháp Application_Start().
  3. Tạo lại dự án và sau đó bắt đầu lại.

Hy vọng điều này cũng phù hợp với bạn.

2

Trong Global.asax.cs thay

BundleTable.Bundles.RegisterTemplateBundles();

với

BundleTable.Bundles.EnableDefaultBundles();

0

Đây là cách nó hoạt động đối với tôi.

này được đơn giản hóa phiên bản tôi chỉ sử dụng default.aspx tập tin không global.asax (bạn có thể chúng nó nếu bạn muốn)

Trong ví dụ này tôi sử dụng 2 thư mục Content2Scripts2

trong Content2 Tôi có 2 tệp css một cho class = "naziv" và một cho class = "naziv2"

trong Scripts2 có 2 tệp có định nghĩa f1() và khác với f2() definitio n

trong thư mục/bin nên có 3 file:

Microsoft.Web.Infrastructure.dll, System.Web.Optimization.dll, WebGrease.dll

<%@ Page Title="Home Page" Language="vb" debug="true"%> 
<%@ Import namespace="System.Web.Optimization" %> 

<script runat="server" > 
    Sub Page_Load(sender As Object, e As EventArgs) 
     System.Web.Optimization.BundleTable.EnableOptimizations = True ''true will force optimization even if debug=true 

     Dim siteCssBundle = New StyleBundle("~/Content2/css") 
     siteCssBundle.IncludeDirectory("~/Content2", "*.css") 
     BundleTable.Bundles.Add(siteCssBundle) 

     Dim siteJsBundle = New ScriptBundle("~/Scripts2/js") 
     siteJsBundle.IncludeDirectory("~/Scripts2", "*.js") 
     BundleTable.Bundles.Add(siteJsBundle) 
    End Sub 
</script> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
    <head> 
    </head> 
    <body onload="f1(); f2();"> 
     <%: Styles.Render("~/Content2/css")%> 
     <%: Scripts.Render("~/Scripts2/js")%> 
     <br /> 
     <span class="naziv">Span 1</span> <br /> 
     <span class="naziv2">Span 2</span> <br /> 
    </body> 
</html> 
7

Điều bạn đang làm "sai" là đường dẫn gói của bạn tương ứng với đường dẫn REAL. Như tôi đã hiểu, khi yêu cầu "/ Static/Css? V = D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41" xuất hiện, công cụ định tuyến đầu tiên sẽ tìm đường dẫn vật lý. Nó tìm thấy một phù hợp với thư mục của bạn "tĩnh" và nó cố gắng tìm một tập tin trong nó phù hợp với "Css? V = D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41". Khi nó không thể tìm thấy, bởi vì nó không tồn tại, nó mang lại cho một 404. (Tôi cũng nhìn thấy một truy cập bị từ chối.) Khi công cụ định tuyến không thể tìm thấy một đường dẫn tập tin vật lý nó sau đó sẽ xử lý khác như bó và rút gọn để phân phối yêu cầu.

Dù sao tôi nghĩ bạn đã tìm ra từ nhận xét của bạn nhưng tôi không chắc chắn nó sẽ rất rõ ràng cho bất cứ ai tìm thấy câu hỏi của bạn. Đơn giản chỉ cần thay đổi đăng ký của bạn từ:

var bootstrapCss = new Bundle("~/Static/Css", new CssMinify()); 

tới:

var bootstrapCss = new Bundle("~/bundles/Css", new CssMinify()); 

Nếu bạn thực hiện sự thay đổi đó, vấn đề của bạn sẽ biến mất, (cấp không có đường dẫn vật lý tương ứng với "bó"

.