Styles.Render ใน MVC4


381

ใน.NET MVC4โครงการ@Styles.Renderทำงานอย่างไร

ฉันหมายถึง@Styles.Render("~/Content/css")ไฟล์ที่มันกำลังเรียก?

ฉันไม่มีไฟล์หรือโฟลเดอร์ชื่อ "css" ด้านในของฉัน Contentโฟลเดอร์


11
ดูasp.net/mvc/tutorials/mvc-4/bundling-and-minificationของฉันเกี่ยวกับการสอน
RickAndMSFT

คำตอบ:


453

กำลังเรียกไฟล์ที่รวมอยู่ในบันเดิลนั้นซึ่งถูกประกาศไว้ในBundleConfigคลาสในApp_Startโฟลเดอร์

ในกรณีนั้นการเรียกไปที่ @Styles.Render("~/Content/css")กำลังเรียก "~ / Content / site.css"

bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

22
สิ่งหนึ่งที่ควรทราบคือมันจะไม่เพิ่มไฟล์. css ที่ย่อเล็กสุดลงในบันเดิลแล้ว ตัวอย่าง: มันไม่ทำงานกับ bootstrap.min.js เฉพาะกับ bootstrap.js ฉันหวังว่านี่จะช่วยผู้อื่นได้
codea

5
นี่กำลังพูดถึงสไตล์ไม่ใช่สคริปต์ หากคุณต้องการใช้ bootstrap.min.js เพียงแค่สร้างมัดดังนี้: bundles.Add (ใหม่ ScriptBundle ("~ / มัด / bootstrap") รวม ("~ / สคริปต์ / bootstrap.min.js");
Xcalibur37

1
@codea ฉันไม่แน่ใจว่าการตั้งค่าของคุณคืออะไร แต่โดยค่าเริ่มต้น Bundler จะใช้เวลา*.min.*มากกว่า*.*ไฟล์
skmasq

@skmasq ในขณะที่เขียนบรรทัดเหล่านี้ฉันใช้ VS2013 สิ่งต่าง ๆ อาจเปลี่ยนแปลงไปจนถึงปัจจุบัน ขอขอบคุณสำหรับการกล่าวขวัญว่า :)
codea

ฉันไม่เข้าใจ .... ทำไมต้องสร้างปัญหาการรวมกลุ่มและเพิ่มเส้นทางเหล่านั้นไปยังคลาสที่บ้าคลั่งเหล่านี้ใน MVC เมื่อคุณสามารถเพิ่ม CSS <link> ลงในไฟล์ในหน้าเว็บของคุณได้? หากคุณเพิ่มลิงก์ CSS ทั้งหมดลงในสไตล์ชีทของคุณด้วยการพูดว่าไฟล์เลย์เอาต์หรือมุมมองบางส่วนคุณสามารถจัดการได้ในที่เดียวเช่นกัน นี่เป็นการออกแบบที่ไม่ดีสำหรับเส้นทางสไตล์รหัสยากเช่นนั้นเนื่องจากคุณไม่สามารถสร้าง CSS สกินซึ่งเป็นจุดประสงค์ทั้งหมดของระบบ CSS เมื่อมันถูกออกแบบเมื่อ 20 ปีที่แล้ว
Stokely

34

ระวังเรื่องตัวพิมพ์เล็ก หากคุณมีไฟล์

/Content/bootstrap.css

และคุณเปลี่ยนเส้นทางใน Bundle.config เป็น

รวม ( "~ / เนื้อหา / Bootstrap.css")

มันจะไม่โหลด css


นอกจากนี้: การสะกดที่สองนั้นแตกต่างกัน
Dan Esparza

1
มีการรองรับ sass / less-files เช่นกัน?
Manticore

12

สายไปงานเลี้ยงเล็กน้อย แต่ดูเหมือนว่าไม่มีใครพูดถึงการ
รวมกลุ่ม & การลดขนาดของStyleBundleดังนั้น ..

@Styles.Render("~/Content/css") 

โทรเข้าApplication_Start():

BundleConfig.RegisterBundles(BundleTable.Bundles);            

ซึ่งจะเรียก

public static void RegisterBundles(BundleCollection bundles)
{
    bundles.Add(new StyleBundle("~/Content/css").Include(
              "~/Content/bootstrap.css",
              "~/Content/Site.css"));
}

RegisterBundles()รวมและย่อขนาด bootstrap.css & Site.css
เป็นไฟล์เดียวได้ อย่างมีประสิทธิภาพ

<link href="/Content/css?v=omEnf6XKhDfHpwdllcEwzSIFQajQQLOQweh_aX9VVWY1" rel="stylesheet">

แต่ ..

<system.web>
  <compilation debug="false" targetFramework="4.6.1" />
</system.web>

เฉพาะเมื่อ debugมีการตั้งค่าในfalse มิฉะนั้นและจะทำหน้าที่เป็นรายบุคคล ไม่รวมหรือไม่ย่อ:Web.config
bootstrap.cssSite.css

<link href="/Content/bootstrap.css" rel="stylesheet">
<link href="/Content/Site.css" rel="stylesheet">


0

ตามที่กำหนดไว้ใน App_start.BundleConfig มันเป็นแค่การโทร

bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/site.css"));

ไม่มีอะไรเกิดขึ้นแม้ว่าคุณจะลบหัวข้อนั้นออก


0

โปโลฉันจะไม่ใช้การรวมกลุ่มใน MVC ด้วยเหตุผลหลายประการ มันไม่ทำงานในกรณีของคุณเนื่องจากคุณต้องตั้งค่าคลาส BundleConfig แบบกำหนดเองในโฟลเดอร์ Apps_Start ของคุณ สิ่งนี้ไม่สมเหตุสมผลเมื่อคุณสามารถเพิ่มสไตล์ในส่วนหัวของ html ของคุณได้โดยง่าย:

<link rel="stylesheet" href="~/Content/bootstrap.css" />
<link rel="stylesheet" href="~/Content/bootstrap.theme.css" />

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

การเพิ่มลิงค์แบบตายตัวลงใน CSS ในการแบ่งคลาสโดยมีวัตถุประสงค์เพื่อแยก UI และการออกแบบออกจากโมเดลแอปพลิเคชันเช่นกัน คุณไม่ต้องการให้จัดการสไตล์ชีตแบบแผ่นในรหัส c # เนื่องจากคุณไม่สามารถสร้าง "สกิน" หรือแยกแบบจำลองสไตล์สำหรับอุปกรณ์ต่าง ๆ ธีมและอื่น ๆ เช่น:

<link rel="stylesheet" href="~/UI/Skins/skin1/base.css" />
<link rel="stylesheet" href="~/UI/Skins/skin2/base.css" />

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

วัตถุประสงค์ทั้งหมดของ CSS 15 ปีที่ผ่านมาคือการพัฒนา "สกิน" สไตล์ชีทที่ควบคุมโดยผู้ใช้และการควบคุมแอปพลิเคชันสำหรับเว็บไซต์ดังนั้นคุณสามารถสลับ UI รูปลักษณ์และความรู้สึกแยกจากแอปพลิเคชันและนำเนื้อหาที่เป็นอิสระของโครงสร้างข้อมูล .... เช่นรุ่นสำหรับพิมพ์, มือถือ, รุ่นเสียง, raw xml, เป็นต้น

ด้วยการย้ายกลับไปยังระบบเส้นทางแบบ "ล้าสมัย" นี้โดยใช้คลาส C # สไตล์แข็งเช่น Bootstrap และการรวมชุดรูปแบบของไซต์ด้วยรหัสแอปพลิเคชันเราได้ย้อนกลับไปอีกครั้งกับการสร้างเว็บไซต์ในปี 1998


1
ดังนั้นเพื่อ heck ด้วยminificationแล้ว? : s / :(
Scott Fraley

ใช่. เหตุใดนักพัฒนาซอฟต์แวร์ในปี 2019 จึงลด css และ javascript ให้น้อยที่สุด แต่จากนั้นสร้าง API เช่น Angular และอื่น ๆ ที่ส่งเมกะไบต์ ECMAScript (Javascript) ที่ไม่จำเป็นไปยังไคลเอนต์ เราเคยส่งรหัสน้อยลงหรือบีบอัดรหัสให้กับลูกค้าด้วยแบนด์วิดธ์ จำกัด เพื่อให้พวกเขาได้รับรหัสเมื่อพวกเขาถูก จำกัด โดยแบนด์วิดธ์ .... นั่นคือโมเด็ม 14k baud เรามี 5G มาแล้วดังนั้นการบีบอัดรหัสเช่นการบีบอัด gif หรือการย่อขนาดไม่จำเป็นต้องใช้ แต่เรากลับไปส่งสคริปต์ขนาดใหญ่ให้กับลูกค้าเป็นผล เหตุใดจึงลดขนาดลง
โตรเคน

1
เพราะเราควรจะส่งสายไปให้น้อยที่สุดเท่าที่จะทำได้? ฉันพยายามเก็บของให้น้อยที่สุด
Scott Fraley

0

ฉันทำทุกสิ่งที่จำเป็นเพื่อเพิ่มการรวมลงในเว็บ MVC 3 (ฉันใหม่กับโซลูชันที่มีอยู่) Styles.Renderไม่ได้ผลสำหรับฉัน ในที่สุดฉันก็ค้นพบว่าฉันแพ้ลำไส้ใหญ่ ในหน้าต้นแบบ: <%: Styles.Render("~/Content/Css") %> ฉันยังคงสับสนเกี่ยวกับสาเหตุที่ (ในหน้าเดียวกัน) <% Html.RenderPartial("LogOnUserControl"); %>ทำงานโดยไม่มีเครื่องหมายโคลอน

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