Styles.Render trong MVC4


Câu trả lời:


453

Nó đang gọi các tệp có trong gói cụ thể được khai báo bên trong BundleConfiglớp trong App_Startthư mục.

Trong trường hợp cụ thể đó, cuộc gọi đến @Styles.Render("~/Content/css")đang gọi "~ / Content / site.css".

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

22
Một điều cần biết là nó sẽ không thêm tệp .css đã được thu nhỏ vào gói. Ví dụ: nó không hoạt động với bootstrap.min.js, chỉ với bootstrap.js. Tôi hy vọng điều này có thể giúp đỡ người khác.
codea

5
Đây là nói về phong cách, không phải kịch bản. Nếu bạn muốn sử dụng bootstrap.min.js, chỉ cần tạo một gói như thế này: bundles.Add (new ScriptBundle ("~ / bundles / bootstrap"). Bao gồm ("~ / Sc scripts / bootstrap.min.js"));
Xcalibur37

1
@codea Tôi không chắc thiết lập của bạn là gì, nhưng theo mặc định, trình đóng gói sẽ tiếp *.min.*quản *.*các tệp.
skmasq

@skmasq, tại thời điểm viết những dòng này, tôi đang sử dụng VS2013. Mọi thứ có thể đã thay đổi cho đến bây giờ. Cảm ơn vì đã đề cập đến điều đó :)
codea

Tôi không hiểu được .... tại sao lại gặp rắc rối khi tạo các gói và thêm các đường dẫn đó vào các lớp điên này trong MVC khi bạn chỉ cần thêm CSS <link> vào tệp trong trang web của mình? Nếu bạn thêm tất cả các liên kết CSS của bạn vào biểu định kiểu của bạn trong tệp bố cục hoặc chế độ xem một phần, bạn cũng có thể quản lý chúng ở một nơi đơn giản. Đây cũng là thiết kế tồi đối với các đường dẫn kiểu mã cứng như thế, vì bạn không còn có thể tạo giao diện CSS, đó là toàn bộ mục đích của hệ thống CSS khi nó được thiết kế 20 năm trước.
Stokely

34

Xem ra cho trường hợp nhạy cảm. Nếu bạn có một tập tin

/Content/bootstrap.css

và bạn chuyển hướng trong Bundle.config sang

.Incoide ("~ / Nội dung / Bootstrap.css")

Nó sẽ không tải css.


Ngoài ra: Bao gồm thứ hai được đánh vần khác nhau.
Dan Esparza

1
Có hỗ trợ cho sass / ít tập tin không?
Manticore

12

Một chút muộn để dự tiệc. Nhưng nó có vẻ như không ai có đề cập
& việc rút gọn của StyleBundle, vì vậy ..

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

gọi trong Application_Start():

BundleConfig.RegisterBundles(BundleTable.Bundles);            

đến lượt nó gọi

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

RegisterBundles()hiệu quả liên hợp gặt đập & minifies bootstrap.css & Site.css
thành một file duy nhất,

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

Nhưng ..

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

chỉ khi debug được đặt thành falsetrong Web.config.
Nếu không bootstrap.css& Site.csssẽ được phục vụ riêng.
Không bó, cũng không rút gọn:

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

0

src="@url.content("~/Folderpath/*.css")" nên kết xuất kiểu


0

Như được định nghĩa trong App_start.BundleConfig, nó chỉ gọi

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

Không có gì xảy ra ngay cả khi bạn loại bỏ phần đó.


0

Polo Tôi sẽ không sử dụng Gói trong MVC vì nhiều lý do. Nó không hoạt động trong trường hợp của bạn vì bạn phải thiết lập lớp BundleConfig tùy chỉnh trong thư mục Apps_Start. Điều này vô nghĩa khi bạn có thể đơn giản thêm một kiểu vào đầu html của mình như vậy:

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

Bạn cũng có thể thêm những thứ này vào một lớp Layout.cshtml hoặc một phần lớp được gọi từ tất cả các lượt xem của bạn và thả vào từng trang. Nếu phong cách của bạn thay đổi, bạn có thể dễ dàng thay đổi tên và đường dẫn mà không cần phải biên dịch lại.

Việc thêm các liên kết được mã hóa cứng vào CSS trong một lớp phá vỡ với toàn bộ mục đích tách giao diện người dùng và thiết kế khỏi mô hình ứng dụng. Bạn cũng không muốn các đường dẫn biểu định kiểu được mã hóa cứng được quản lý trong c # vì bạn không còn có thể tạo "giao diện" hoặc các mô hình kiểu riêng biệt để nói các thiết bị, chủ đề khác nhau, v.v.

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

Sử dụng hệ thống này và Dao cạo giờ đây bạn có thể tắt Đường dẫn da từ cơ sở dữ liệu hoặc cài đặt người dùng và thay đổi toàn bộ thiết kế trang web của bạn bằng cách thay đổi đường dẫn một cách linh hoạt.

Toàn bộ mục đích của CSS 15 năm trước là phát triển cả "giao diện" được điều khiển bởi ứng dụng và kiểm soát ứng dụng cho các trang web để bạn có thể chuyển giao diện UI và cảm nhận tách biệt khỏi ứng dụng và sử dụng lại nội dung độc lập với cấu trúc dữ liệu. .... ví dụ: phiên bản có thể in, thiết bị di động, phiên bản âm thanh, xml thô, v.v.

Bằng cách quay trở lại hệ thống đường dẫn mã hóa "lỗi thời" này bằng cách sử dụng các lớp C #, các kiểu cứng nhắc như Bootstrap và hợp nhất các chủ đề của các trang web với mã ứng dụng, chúng tôi đã quay trở lại cách các trang web được xây dựng vào năm 1998.


1
Vì vậy, để heck với minificationsau đó? : s / :(
Scott Fraley

Đúng. Tại sao các nhà phát triển vào năm 2019 giảm thiểu css và javascript nhưng sau đó xây dựng API như Angular và các API khác gửi megabyte ECMAScript (Javascript) không cần thiết cho khách hàng? Chúng tôi thường gửi ít mã hoặc mã nén hơn cho khách hàng với băng thông hạn chế để họ có thể nhận được mã khi họ bị hạn chế bởi băng thông .... tức là modem 14k baud. Chúng tôi có 5G sắp tới để nén mã như nén gif hoặc thu nhỏ là không cần thiết. Tuy nhiên, chúng tôi đã đi ngược lại gửi rất nhiều kịch bản cho khách hàng. Vậy tại sao giảm thiểu bất cứ điều gì?
Stokely

1
Bởi vì chúng ta nên gửi càng ít qua dây càng tốt? Tôi chắc chắn cố gắng giữ mọi thứ ở mức tối thiểu.
Scott Fraley

0

Tôi đã làm tất cả những điều cần thiết để thêm gói vào web MVC 3 (Tôi mới sử dụng giải pháp hiện có). Styles.Renderkhông làm việc cho tôi. Cuối cùng tôi phát hiện ra tôi chỉ đơn giản là thiếu một dấu hai chấm. Trong trang chính: <%: Styles.Render("~/Content/Css") %> Tôi vẫn bối rối về lý do tại sao (trên cùng một trang) <% Html.RenderPartial("LogOnUserControl"); %>hoạt động mà không có dấu hai chấm.

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.