วิธีการเพิ่มการอ้างอิงถึง System.Web.Optimization สำหรับแอป MVC-3-modified-to-4


458

ฉันกำลังพยายามใช้คุณลักษณะการรวมกลุ่มใหม่ในโครงการที่ฉันเพิ่งแปลงจาก MVC 3 เป็น MVC 4 เบต้า มันต้องมีบรรทัดของรหัสใน global.asax BundleTable.Bundles.RegisterTemplateBundles();ซึ่งต้องการusing System.Web.Optimization;ที่ด้านบน

เมื่อฉันทำสิ่งนี้ฉันจะได้เส้นสีแดงไก่เขี่ยที่พูดว่า "คุณขาดการอ้างอิงชุดประกอบหรือไม่" เมื่อฉันพยายามและเพิ่มการอ้างอิงและคลิกที่แท็บ .NET ในกล่องโต้ตอบเรียงลำดับจาก AZ, System.Web.Optimizationฉันไม่เห็น

ฉันจะเพิ่มการอ้างอิงนี้ไปยังโครงการของฉันได้อย่างไร


6
ฉันมีการปรับให้เหมาะสมแล้ว แต่มันทำให้เกิดปัญหากับ ScriptBundle ซึ่งฉันสามารถแก้ไขได้หลังจากถอนการติดตั้ง Opti ... จากนั้นติดตั้งใหม่
Myzifer

1
@Myzifer คุณควรส่งความคิดเห็นของคุณเป็นคำตอบ มันเป็นสิ่งเดียวที่ทำงานให้ฉันเพื่อนำSystem.Web.Optimizationโหนดกลับไปที่การอ้างอิงของฉัน
Snekse

2
@myzifer คำตอบของคุณถูกต้องสำหรับพฤติกรรมแปลก ๆ นี้ เพียงสิ่งที่จะแก้ไขปัญหานี้สำหรับฉันกำลังทำงานสาย nuget cmd: ถอนการติดตั้งแพคเกจ Microsoft.AspNet.Web.Optimization แล้วขวาหลังจากที่ทำงานติดตั้ง: ติดตั้งแพคเกจ Microsoft.AspNet.Web.Optimization พยายามทำให้เรื่องนี้ใช้งานได้หลายสัปดาห์ในคอมพิวเตอร์ที่บ้านของฉันกับ VStudio 2013 และไม่สามารถทำได้ ขอบคุณมาก ๆ.
raddevus

@ Myzifer - ทำงานให้ฉันด้วย - "Checked out" โครงการจาก VSOnline และมีข้อผิดพลาดนี้ - ถอนการติดตั้งแล้วติดตั้งใหม่ - งาน 20 วินาทีที่สอง - ขอบคุณ - นี่เป็นหนึ่งในปัญหาโง่ ๆ ที่คุณสามารถสูญเสียวัน!
Percy

คำตอบ:


728

อัปเดต
เวอร์ชั่น 1.1.x พร้อมใช้งานแล้วโปรดอ่านบันทึกประจำรุ่น: https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization


แพ็คเกจ Microsoft.Web.Optimization ล้าสมัยแล้ว ด้วย ASP.NET (MVC) 4 ขึ้นไปคุณควรติดตั้ง Microsoft ASP.NET Web Optimization Framework:

  • ติดตั้งแพ็กเกจจากnuget :

    Install-Package Microsoft.AspNet.Web.Optimization
  • สร้างและกำหนดค่าบันเดิลใน 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")
            );
        }
    }
  • เรียกใช้ฟังก์ชัน RegisterBundles () จาก Application_Start () ใน global.asax.cs ของคุณ:

    using System.Web.Optimization;
    
    protected void Application_Start() {
         ...
         BundleConfig.RegisterBundles(BundleTable.Bundles);
         ...
    }
  • ใน view.cshtml ของคุณจะรวมเนมสเปซของการเพิ่มประสิทธิภาพและแสดงบันเดิล:

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

ดูhttp://www.asp.net/mvc/overview/performance/bundling-and-minificationสำหรับข้อมูลเพิ่มเติม


2
คุณต้องการ MVC4 เพื่อใช้สิ่งนี้หรือไม่?
FloatLeft

5
มันไม่ล้าสมัย นี่คือวิธีที่ฉันใช้กับรุ่นสุดท้ายของ Visual Studio 2012 และ ASP.NET (MVC) 4.
mhu

29
คำตอบของคุณรวมถึง "using System.Web.Optimization;" ซึ่งเป็นสิ่งที่ผู้ถามถาม
davidpricedev

9
@dave: ดีหรือไม่ดี เพื่อแก้ปัญหา "การอ้างอิงแอสเซมบลีที่หายไป" Microsoft.AspNet.Web.Optimization ควรได้รับการติดตั้งตามที่ระบุไว้ในคำตอบ
mhu

6
ในเทมเพลต MVC ที่เป็นค่าเริ่มต้นฉันสามารถใช้คลาสสคริปต์ได้โดยไม่ต้องเพิ่ม System.Web.Optimization namespace ที่ด้านบนของหน้า แต่ใน progect ของฉันฉันได้รับข้อผิดพลาด "ชื่อสคริปต์ไม่มีอยู่" ฉันจะแก้ไขสิ่งนั้นได้อย่างไร การเพิ่มเนมสเปซนี้ใน web.config ไม่ได้ช่วยอะไร แก้ไข: วิธีการแก้ปัญหาการโหลดซ้ำช่วยได้ :) :)
Wachburn

83

ด้วย ASP.Net MVC 4 เวอร์ชันสุดท้ายที่เผยแพร่วิธีการดังต่อไปนี้:

  • ติดตั้ง Microsoft.AspNet.Web.Optimization ผ่าน nuget (เนื่องจากไม่ได้ติดตั้งโดยเฟรมเวิร์ก)

    install-package Microsoft.AspNet.Web.Optimization
  • สร้างชุดใน Global.asax Application_Start:

    var scripts = new ScriptBundle("~/MyBundle");
    scripts.IncludeDirectory("~/Scripts/MyDirectory", "*.js");
    BundleTable.Bundles.Add(scripts);
  • เพิ่มเนมสเปซ "System.Web.Optimization" ให้กับ "Views" web.config:

     <pages pageBaseType="System.Web.Mvc.WebViewPage">
        <namespaces>
            <add namespace="System.Web.Optimization" />
        </namespaces>
    </pages>
  • ใน view.cshtml ของคุณเพิ่มการรวมลงในบันเดิลที่สร้างขึ้นในขั้นตอนสุดท้าย:

    @Scripts.Render("~/MyBundle")

ในโหมดแก้ไขข้อบกพร่องไฟล์สคริปต์ทั้งหมดในไดเรกทอรีของคุณจะแสดงผลเป็นรายบุคคล ในโหมดการเปิดตัวพวกเขาจะถูกรวมและย่อขนาด


ถูกต้องเวอร์ชันนี้รวมไว้ด้วย รุ่นอื่นไม่ได้
ลุคเบลบีน่า

1
ฉันไม่สามารถเข้าใจได้ว่าทำไมสิ่งนี้ถึงไม่เหมาะกับฉัน ฉันได้ลองทั้งวิธีนี้และสร้างมัดใน BundleConfig.cs แต่เมื่อฉันเพิ่ม @ Styles.Render ("~ / CssBundle") ในมุมมองของฉันทั้งหมดที่ฉันได้รับคือ <link href = "/ CssBundle" rel = "stylesheet "/> ที่ให้ฉัน 404 ความคิดใดทำไม
vsdev

@vsdev ฉันรู้ว่านี่มันสายไปแล้ว 4 ปี แต่คุณอาจต้องตรวจสอบ BundleConfig.cs ของคุณเพื่อให้แน่ใจว่าคุณกำลังเพิ่มอย่างถูกต้อง - บรรทัดในคำตอบนี้เป็นการอ้างอิง".js"ไฟล์เท่านั้น ข้างในpublic static void RegisterBundles(BundleCollection bundles) { ... }คุณควรจะทำสิ่งที่ชอบbundles.Add(new StyleBundle("~/CssBundle"));และมันจะคว้าไฟล์ CSS ทั้งหมดในCssBundleโฟลเดอร์ของคุณ คุณไม่ต้องการScriptBundleมันมีอยู่ในตัวอย่างสำหรับไฟล์ CSS
vapcguy

17

อัพเดต (ติดตั้งใหม่) แพ็กเกจจาก nuget คุณสามารถใช้คำสั่ง:

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


14

ในกรณีของฉันมันเป็นปัญหา tfs เนื่องจาก tfs ไม่รวมไบนารีดังนั้น Nugget PM จึงค้นหา nugget ที่ติดตั้งและไม่อัปเดตไลบรารีหากคุณมีปัญหาที่คล้ายกัน:

  • ไปที่การควบคุมแหล่งที่มา
  • นำทางไปยัง .. \ packages \ Microsoft.Web.Optimization
  • เพิ่มโฟลเดอร์ lib (ยกเลิกการทำเครื่องหมายส่วนขยายไบนารีที่ไม่รวม)
  • อัพเดตโซลูชันของคุณและเพิ่มการอ้างอิง dll จากพา ธ

หมายเหตุ: โฟลเดอร์แพ็คเกจอยู่ในระดับเดียวกันกับไฟล์ yousolution.sln


11

ใช้ nuget เพื่อถอนการติดตั้ง System.Web.Optimization ในคอนโซลตัวจัดการแพ็คเกจเช่นนี้:

ถอนการติดตั้งแพ็คเกจ Microsoft.AspNet.Web.Optimization

จากนั้นติดตั้งใหม่โดยใช้:

ติดตั้งแพ็คเกจ Microsoft.AspNet.Web.Optimization

อาจแก้ปัญหานี้ให้คุณ


1
ไม่แน่ใจว่าวิธีนี้ตอบคำถามได้อย่างไร
TylerD87

@ TylerD87 เรียบง่ายมันแก้สถานการณ์เฉพาะและฉันไม่ใช่คนเดียวที่พบสิ่งนี้เป็นกรณีถ้าคุณอ่านความคิดเห็นเกี่ยวกับคำถามคุณจะสังเกตเห็น Snekse พูดเมื่อวันที่ 29 เม.ย. '14 ที่ 16:39 พวกเขาจำเป็นต้องทำตามคำแนะนำเฉพาะที่ฉันให้และด้านล่างคนอื่นโพสต์มากเหมือนกันในภายหลังและถูกยกระดับขึ้น
Myzifer

อาจแก้ไขคำตอบของคุณเพื่อให้ดูเหมือนคำตอบมากกว่านี้ใช่ไหม ฉันไม่รู้ด้วยซ้ำว่าคุณกำลังตอบคำถามหรือสิ่งที่คุณแนะนำ
TylerD87

@ TylerD87 คำถามคือเกี่ยวกับการเพิ่มประสิทธิภาพและคำตอบของฉันคือเกี่ยวกับการเพิ่มประสิทธิภาพมันแก้ปัญหารายละเอียดในคำถามและได้รับการยอมรับอย่างน้อย 2 คนถ้าคุณจะให้รายละเอียดว่าคุณเข้าใจผิดคำตอบของฉันอย่างไร ฉันสามารถแก้ไข / แก้ไขเพื่อให้คำตอบที่ชัดเจนยิ่งขึ้นแก่ผู้ชมในวงกว้างจากนั้นฉันก็ยินดีที่จะทำการเปลี่ยนแปลงดังกล่าว แต่หากไม่มีการวิจารณ์เชิงสร้างสรรค์ฉันไม่สามารถระบุได้ว่าฉันจะปรับปรุงอย่างไร
Myzifer

สวัสดีฉันได้แนะนำการแก้ไขซึ่งทำให้ชัดเจนยิ่งขึ้นว่าฉันหมายถึงอะไร เมื่ออ่านความคิดเห็นที่ด้านบนฉันเห็นว่านี่เป็นข้อเสนอแนะที่ใช้งานได้จริง แต่วิธีที่คุณนำเสนอคำตอบนั้นไม่ชัดเจนเกี่ยวกับสิ่งที่คุณแนะนำ
TylerD87

6

ติดตั้งจากNUGetผ่าน Visual Studio Open Visual Studio 2010 เลือก Tools-> Library Package Manager-> Console Manager Package

วิธีนี้จะเปิด conslve วาง

Install-Package Microsoft.AspNet.Web.Optimization 

และป้อน และคุณทำเสร็จแล้ว


2

ตั้งค่าใน Global.asax application_start (ในโหมด RELEASE ฯลฯ ):

BundleTable.EnableOptimizations = **true**;

เพื่อเปิดใช้การลดขนาดและเปลี่ยนเป็นเท็จในโหมด DEBUGเพื่อแสดงไฟล์สคริปต์และสไตล์ทั้งหมดแยกจากกัน


5
ง่ายต่อการควบคุมผ่าน web.config หาก<compilation debug="true" />มีการตั้งค่า (ซึ่งเป็นมาตรฐานที่ค่อนข้างดีเมื่อสร้างรุ่นการแก้ไขข้อบกพร่อง) จะไม่มีการปรับให้เหมาะสม โดยปกติการตั้งค่านี้จะถูกลบโดยอัตโนมัติในการสร้างรุ่น BundleTable.EnableOptimizationsควรใช้เพื่อลบล้าง web.config เท่านั้น สำหรับข้อมูลเพิ่มเติม: asp.net/mvc/tutorials/mvc-4/bundling-and-minification (ค้นหา "การควบคุม Bundling และ Minification")
mhu

สิ่งนี้ช่วยฉันได้มากขอบคุณ ฉันต้องปิดการใช้งานเพราะทำงานกับ dotless + RequestReduce ทำให้การรวมกลุ่มยุ่งเหยิงยุ่งเหยิง
siva.k

การตั้งค่านี้ขึ้นอยู่กับว่าคุณกำลังใช้ไฟล์ที่ลดขนาดล่วงหน้าในชุดรวมของคุณหรือถ้าคุณกำลังใช้ไฟล์ที่ไม่ย่อขนาด - ไม่มากถ้าคุณอยู่ใน Debug หรือ Release ยกเว้นวิธีปฏิบัติที่ดีที่สุดสำหรับแต่ละโหมด - เช่น คุณสามารถมีโปรเจ็กต์ที่คุณกำลังคอมไพล์ในโหมดดีบั๊ก แต่ที่ที่คุณมีBundleTable.EnableOptimizations = false;เพราะใน BundleConfig.cs คุณกำลังระบุไฟล์ที่ลดขนาดล่วงหน้าทั้งหมดและคุณไม่ต้องการให้มันลดขนาดลงอีก
vapcguy

นี่เป็นเพียงคำตอบสำหรับปัญหาของใครบางคนหากพวกเขาใช้ไฟล์ที่ไม่ได้ลดขนาดไฟล์ล่วงหน้า (เช่นไฟล์ที่ไม่มี. min) ใน BundleConfig.cs หากพวกเขาใช้ไฟล์. min และตั้งค่าเป็นจริงมันจะมีปัญหา
vapcguy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.