Cách thêm tham chiếu vào System.Web.Optimization cho ứng dụng MVC-3-convert-to-4


458

Tôi đang cố gắng sử dụng tính năng gói mới trong một dự án gần đây tôi đã chuyển đổi từ MVC 3 sang MVC 4 beta. Nó đòi hỏi một dòng mã trong global.asax, BundleTable.Bundles.RegisterTemplateBundles();yêu cầu using System.Web.Optimization;ở trên cùng.

Khi tôi làm điều này, tôi nhận được các dòng nguệch ngoạc màu đỏ có nội dung: "Bạn có đang thiếu một tài liệu tham khảo lắp ráp không?" Khi tôi thử và thêm tham chiếu và nhấp vào tab .NET trong hộp thoại, sắp xếp từ AZ, tôi không thấy System.Web.Optimization.

Làm thế nào để tôi thêm tài liệu tham khảo này vào dự án của tôi?


6
Tôi đã có Tối ưu hóa nhưng nó đã gây ra sự cố với ScriptBundle mà tôi chỉ có thể giải quyết sau khi gỡ cài đặt Opti ... sau đó cài đặt lại.
Myzifer

1
@Myzifer Bạn nên gửi bình luận của bạn như một câu trả lời. Đó là điều duy nhất làm việc cho tôi để đưa System.Web.Optimizationnút trở lại Tài liệu tham khảo của tôi.
Snekse

2
@myzifer Câu trả lời của bạn là câu trả lời đúng cho hành vi kỳ quặc này. Điều duy nhất có thể giải quyết vấn đề này đối với tôi là chạy dòng cmd nuget: UnInstall-Gói Microsoft.AspNet.Web.Optimization và ngay sau đó chạy cài đặt: Cài đặt gói Microsoft.AspNet.Web.Optimization. Đã thử để làm việc này trong nhiều tuần trên máy tính ở nhà của tôi với VStudio 2013 và không bao giờ có thể có được nó. Cảm ơn rất nhiều.
raddevus

@Myzifer - cũng làm việc cho tôi - "Đã kiểm tra" một dự án từ VSOnline và gặp lỗi này - gỡ cài đặt sau đó cài đặt lại - công việc 20 giây - cảm ơn - đây là một trong những vấn đề ngu ngốc mà bạn có thể dễ dàng mất một ngày!
Percy

Câu trả lời:


728


Phiên bản cập nhật 1.1.x có sẵn, đọc ghi chú phát hành: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


Gói Microsoft.Web.Optimization hiện đã lỗi thời. Với ASP.NET (MVC) 4 trở lên, bạn nên cài đặt Khung tối ưu hóa web ASP.NET của Microsoft:

  • Cài đặt gói từ nuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • Tạo và định cấu hình (các) gói trong App_Start \ BundleConfig.cs:

    public class BundleConfig
    {
        public static void RegisterBundles(BundleCollection bundles) {
            bundles.Add(new ScriptBundle("~/Scripts/jquery").Include(
                "~/Scripts/Lib/jquery/jquery-{version}.js",
                "~/Scripts/Lib/jquery/jquery.*",
                "~/Scripts/Lib/jquery/jquery-ui-{version}.js")
            );
    
            bundles.Add(new ScriptBundle("~/Scripts/knockout").Include(
                 "~/Scripts/Lib/knockout/knockout-{version}.js",
                 "~/Scripts/Lib/knockout/knockout-deferred-updates.js")
            );
        }
    }
  • Gọi hàm RegisterBundles () từ Application_Start () trong global.asax.cs của bạn:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • Trong view.cshtml của bạn bao gồm không gian tên Tối ưu hóa và hiển thị (các) gói:

    @using System.Web.Optimization
    
    @Scripts.Render("~/Scripts/jquery")
    @Scripts.Render("~/Scripts/knockout")

Xem http://www.asp.net/mvc/overview/performance/bundling-and-minification để biết thêm thông tin


2
Bạn có cần MVC4 để sử dụng cái này không?
FloatLeft

5
Nó không lỗi thời. Đây là cách tôi sử dụng nó với các bản phát hành cuối cùng của Visual Studio 2012 và ASP.NET (MVC) 4.
mhu

29
Câu trả lời của bạn bao gồm "sử dụng System.Web.Optimization;", đó chính xác là điều mà người hỏi đang hỏi về.
davidpricedev

9
@dave: Điều đó tốt hay xấu? Để giải quyết "tham chiếu lắp ráp bị thiếu" Microsoft.AspNet.Web.Optimization nên được cài đặt như được đề cập trong câu trả lời.
mhu

6
trong mẫu MVC mặc định tôi có thể sử dụng lớp ScScript mà không cần thêm không gian tên System.Web.Optimization trên đầu trang. Nhưng trong progect của tôi, tôi nhận được lỗi "tên Sc Script không tồn tại". Làm thế nào tôi có thể giải quyết điều đó? Thêm không gian tên này trong web.config không giúp được gì. Chỉnh sửa: tải lại giải pháp đã giúp, xin lỗi :)
Wachburn

83

Với phiên bản phát hành cuối cùng của ASP.Net MVC 4, cách tiếp cận như sau:

  • Cài đặt Microsoft.AspNet.Web.Optimization thông qua nuget (vì nó không được cài đặt bởi khung công tác)

    install-package Microsoft.AspNet.Web.Optimization
  • Tạo gói trong Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • Thêm không gian tên "System.Web.Optimization" vào web.config "Lượt xem":

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • Trong view.cshtml của bạn, thêm một bao gồm vào gói được tạo ở bước cuối cùng:

    @Scripts.Render("~/MyBundle")

Trong chế độ gỡ lỗi, tất cả các tệp script trong thư mục của bạn sẽ hiển thị riêng lẻ; trong chế độ phát hành, chúng sẽ được đóng gói và thu nhỏ.


Chính xác, phiên bản này bao gồm nó. Các phiên bản khác thì không.
Luke Belbina

1
Tôi không thể hiểu tại sao điều này không làm việc cho tôi. Tôi đã thử cả hai cách này và để tạo gói trong BundleConfig.cs nhưng khi tôi thêm @ Styles.Render ("~ / CssBundle") trong chế độ xem của tôi, tất cả những gì tôi nhận được là <link href = "/ CssBundle" rel = "bản định kiểu "/> mang lại cho tôi 404. Có ai biết tại sao không?
vsdev

@vsdev Tôi biết rằng đây là 4 năm quá muộn, nhưng bạn có thể phải kiểm tra BundleConfig.cs của mình để chắc chắn rằng bạn đã thêm chính xác - dòng trong câu trả lời này chỉ là ".js"các tệp tham chiếu . Bên trong public static void RegisterBundles(BundleCollection bundles) { ... }bạn sẽ có thể làm một cái gì đó như thế bundles.Add(new StyleBundle("~/CssBundle"));và nó sẽ lấy tất cả các tệp CSS trong CssBundlethư mục của bạn . Bạn không muốn ScriptBundlenhư trong ví dụ về các tệp CSS.
vapcguy

17

Cập nhật (cài đặt lại) gói từ nuget, bạn có thể sử dụng lệnh:

update-Package Microsoft.AspNet.Web.Optimization -reinstall


14

Trong trường hợp của tôi, đó là sự cố tfs, vì tfs loại trừ nhị phân, do đó, Nugget PM tìm nugget được cài đặt và không cập nhật thư viện Nếu bạn gặp vấn đề tương tự:

  • Kiểm soát nguồn
  • Điều hướng đến .. \ gói \ Microsoft.Web.Optimization
  • Thêm thư mục lib (bỏ chọn phần mở rộng nhị phân loại trừ)
  • Cập nhật giải pháp của bạn và thêm tham chiếu dll từ đường dẫn

NB: thư mục gói nằm trong cùng cấp của tệp yousolution.sln


11

Sử dụng nuget để gỡ cài đặt System.Web.Optimization trong bảng điều khiển trình quản lý gói như thế này:

Gỡ cài đặt-Gói Microsoft.AspNet.Web.Optimization

Sau đó cài đặt lại bằng cách sử dụng:

Cài đặt gói Microsoft.AspNet.Web.Optimization

Có thể giải quyết vấn đề này cho bạn.


1
Không chắc làm thế nào điều này trả lời câu hỏi?
TylerD87

@ TylerD87 Đơn giản, nó giải quyết một tập hợp tình huống cụ thể và tôi không phải là người duy nhất thấy đây là trường hợp, nếu bạn đọc các bình luận về câu hỏi bạn sẽ nhận thấy Snekse nói vào ngày 29 tháng 4, 14 lúc 16:39 họ cần phải làm theo các hướng dẫn cụ thể mà tôi đã đưa ra và bên dưới người khác đã đăng rất nhiều tương tự sau đó và được nâng cấp.
Myzifer

Có thể chỉnh sửa câu trả lời của bạn để nó trông giống như một câu trả lời? Tôi thậm chí không nhận ra bạn đang trả lời câu hỏi hoặc những gì bạn đang đề xuất.
TylerD87

@ TylerD87 Câu hỏi là về Tối ưu hóa và câu trả lời của tôi là về Tối ưu hóa, nó giải quyết vấn đề chi tiết trong câu hỏi và đã được ít nhất 2 người khác thừa nhận, nếu bạn cung cấp chi tiết chính xác cách bạn hiểu sai câu trả lời của tôi và cách tốt nhất Tôi có thể thay đổi / sửa đổi nó để cung cấp cho khán giả rộng hơn một câu trả lời rõ ràng hơn sau đó tôi rất vui khi thực hiện những thay đổi đó nhưng không có sự chỉ trích mang tính xây dựng Tôi không thể xác định cách tôi có thể cải thiện.
Myzifer

Xin chào, tôi đã đề xuất một chỉnh sửa giúp làm rõ hơn những gì tôi đang đề cập. Đọc qua các bình luận ở đầu tôi thấy đây thực sự là gợi ý có hiệu quả nhưng cách trình bày câu trả lời của bạn không rõ ràng về những gì bạn đang thực sự đề xuất.
TylerD87

6

Cài đặt nó từ NUGet thông qua Visual Studio Mở Visual Studio 2010, chọn Công cụ-> Trình quản lý gói thư viện-> Bảng điều khiển quản lý gói

Điều này sẽ mở conslve, dán

Install-Package Microsoft.AspNet.Web.Optimization 

và nhập. và bạn đã hoàn thành


2

được đặt trong Global.asax application_start (ở chế độ ĐÁNG TIN CẬY, v.v.):

BundleTable.EnableOptimizations = **true**;

để bật thu nhỏ và thay đổi thành false trong chế độ DEBUG để hiển thị tất cả các tệp tập lệnh và kiểu riêng lẻ.


5
Việc kiểm soát điều này thông qua web.config sẽ dễ dàng hơn. Nếu <compilation debug="true" />được đặt (khá chuẩn khi xây dựng phiên bản gỡ lỗi), sẽ không có tối ưu hóa. Thông thường cài đặt này được tự động loại bỏ trong bản dựng phát hành. BundleTable.EnableOptimizationschỉ nên được sử dụng để ghi đè lên web.config. Để biết thêm thông tin: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (tìm kiếm "Kiểm soát gói và giảm thiểu")
mhu

Điều này đã giúp tôi rất nhiều, cảm ơn bạn. Tôi đã phải vô hiệu hóa nó vì làm việc với dotless + RequestReduce đang làm cho các gói bị cắt xén lộn xộn.
siva.k

Cài đặt này thực sự phụ thuộc vào việc bạn đang sử dụng các tệp được rút gọn trước trong các gói của mình hay nếu bạn đang sử dụng các tệp không được rút gọn - không quá nhiều nếu bạn đang trong Gỡ lỗi hoặc Phát hành, ngoại trừ các thực tiễn tốt nhất cho từng chế độ đó - ví dụ. , bạn có thể có một dự án bạn đang biên dịch ở chế độ Gỡ lỗi, nhưng ở đâu bạn có BundleTable.EnableOptimizations = false;vì trong BundleConfig.cs của bạn, bạn đang chỉ định tất cả các tệp được rút gọn trước và bạn không muốn nó thực hiện một giảm thiểu khác trên chúng.
vapcguy

Đây thực sự sẽ chỉ là câu trả lời cho vấn đề của ai đó nếu họ đang sử dụng các tệp không được thu nhỏ trước (ví dụ: các tệp KHÔNG CÓ .min) trong BundleConfig.cs của họ. Nếu họ sử dụng tệp .min và đặt thành đúng, nó sẽ có vấn đề.
vapcguy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.