Thêm tệp CSS hoặc JavaScript vào đầu bố cục từ chế độ xem hoặc chế độ xem một phần


176

Đầu trang bố cục:

<head>
    <link href="@Url.Content("~/Content/themes/base/Site.css")"
          rel="stylesheet" type="text/css" />
</head>

Chế độ xem (AnotherView) từ ứng dụng cần:

<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
      rel="stylesheet" type="text/css" />

và AnotherView có chế độ xem một phần (AnotherPartial) cần:

<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
      rel="stylesheet" type="text/css" />

Câu hỏi: Làm thế nào chúng ta có thể thêm các tệp CSS này liên kết các liên kết AnotherView và AnotherPartial vào đầu Bố cục ?

RenderSection không phải là một ý tưởng hay vì AnotherPage có thể có nhiều Phần. Thêm tất cả CSS vào đầu không hữu ích vì nó sẽ thay đổi động (nó phụ thuộc vào Trang khác).


@NuriYILMAZ đó là một sự khác biệt rất lớn giữa "từ lượt xem" và "hoặc lượt xem một phần" theo tiêu đề của bạn nói. Dù sao, bất kỳ ý tưởng mới về vấn đề đó?
Shimmy Weitzhandler

Câu trả lời:


196

Bố trí:

<html>
    <head>
        <meta charset="utf-8" />
        <title>@ViewBag.Title</title>
        <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
        <script src="@Url.Content("~/Scripts/jquery-1.6.2.min.js")" type="text/javascript"></script>
        <script src="@Url.Content("~/Scripts/modernizr-2.0.6-development-only.js")" type="text/javascript"></script>
        @if (IsSectionDefined("AddToHead"))
        {
            @RenderSection("AddToHead", required: false)
        }

        @RenderSection("AddToHeadAnotherWay", required: false)
    </head>

Lượt xem:

@model ProjectsExt.Models.DirectoryObject

@section AddToHead{
    <link href="@Url.Content("~/Content/Upload.css")" rel="stylesheet" type="text/css" />
}

5
Tôi nghĩ rằng đây là giải pháp đơn giản nhất.
iamichi

Đẹp ra khỏi giải pháp hộp!
jerrylroberts

14
Điều đó sẽ không hoạt động nếu AddToHeadphần đó ở chế độ xem một phần được nhúng trong View.
Shimmy Weitzhandler

57
Câu hỏi đề cập cụ thể một phần và câu trả lời được đánh giá cao nhất này không giải quyết được vấn đề! Đây có thể là một giải pháp tuyệt vời cho một truy vấn khác, nhưng không phải là một truy vấn này.
quạ Vulcan

1
Sẽ là một giải pháp tao nhã nếu nó hoạt động hiệu quả với các quan điểm một phần.
Jonny

75

Cập nhật : ví dụ cơ bản có sẵn tại https://github.com/speier/mvcassetshelper

Chúng tôi đang sử dụng cách triển khai sau để thêm các tệp JS và CSS vào trang bố cục.

Xem hoặc xem một phần:

@{
    Html.Assets().Styles.Add("/Dashboard/Content/Dashboard.css");
    Html.Assets().Scripts.Add("/Dashboard/Scripts/Dashboard.js");
}

Trang bố trí:

<head>
    @Html.Assets().Styles.Render()
</head>

<body>
    ...
    @Html.Assets().Scripts.Render()
</body>

Phần mở rộng HtmlHelper:

public static class HtmlHelperExtensions
{
    public static AssetsHelper Assets(this HtmlHelper htmlHelper)
    {
        return AssetsHelper.GetInstance(htmlHelper);
    }    
}

public class AssetsHelper 
{
    public static AssetsHelper GetInstance(HtmlHelper htmlHelper)
    {
        var instanceKey = "AssetsHelperInstance";

        var context = htmlHelper.ViewContext.HttpContext;
        if (context == null) return null;

        var assetsHelper = (AssetsHelper)context.Items[instanceKey];

        if (assetsHelper == null)
            context.Items.Add(instanceKey, assetsHelper = new AssetsHelper());

        return assetsHelper;
    }

    public ItemRegistrar Styles { get; private set; }
    public ItemRegistrar Scripts { get; private set; }

    public AssetsHelper()
    {
        Styles = new ItemRegistrar(ItemRegistrarFormatters.StyleFormat);
        Scripts = new ItemRegistrar(ItemRegistrarFormatters.ScriptFormat);
    }
}

public class ItemRegistrar
{
    private readonly string _format;
    private readonly IList<string> _items;

    public ItemRegistrar(string format)
    {
        _format = format;
        _items = new List<string>();
    }

    public ItemRegistrar Add(string url)
    {
        if (!_items.Contains(url))
            _items.Add(url);

        return this;
    }

    public IHtmlString Render()
    {
        var sb = new StringBuilder();

        foreach (var item in _items)
        {
            var fmt = string.Format(_format, item);
            sb.AppendLine(fmt);
        }

        return new HtmlString(sb.ToString());
    }
}

public class ItemRegistrarFormatters
{
    public const string StyleFormat = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />";
    public const string ScriptFormat = "<script src=\"{0}\" type=\"text/javascript\"></script>";
}

2
@JBeckton: Hãy xem mã và thay thế Insertcác phương thức bằng Addcác phương thức
Valamas

9
@Kalman - tính an toàn của luồng này (theo quan điểm của tôi) khá chính xác đã được đặt câu hỏi: stackoverflow.com/questions/6609586/ Kẻ
Marc Gravell

2
Điều này rất sai; nó nên được [ThreadStatic], hoặc, tốt nhất là, được lưu trữ trong HttpContext.Items.
SLaks

6
Tui bỏ lỡ điều gì vậy? Nếu Styles.Render () được gọi trong <head>, thì mọi tệp css được thêm sau <head> (tức là các tệp được thêm trong chế độ xem một phần) sẽ không được hiển thị. (MVC hiển thị từ trên xuống dưới.)
ken

3
@FernandoCorreia Tôi nghĩ bạn đã hiểu sai tất cả. Các phần được đặt tên không hoạt động trong chế độ xem một phần, đó là cơ sở của toàn bộ chủ đề này.
Shimmy Weitzhandler

11

Đáng buồn thay, theo mặc định, điều này là không thể sử dụng sectionnhư một người dùng khác đề xuất, vì một sectionchỉ có sẵn cho ngay lập tức childcủa a View.

Tuy nhiên, những gì hoạt động là thực hiện và xác định lại sectiontrong mọi quan điểm , có nghĩa là:

section Head
{
    @RenderSection("Head", false)
}

Bằng cách này, mọi góc nhìn đều có thể thực hiện một phần đầu, không chỉ cho trẻ em ngay lập tức. Điều này chỉ hoạt động một phần, đặc biệt là với nhiều phần rắc rối bắt đầu (như bạn đã đề cập trong câu hỏi của bạn).

Vì vậy, giải pháp thực sự duy nhất cho vấn đề của bạn là sử dụng ViewBag. Điều tốt nhất có lẽ sẽ là một bộ sưu tập (danh sách) riêng biệt cho CSS và các tập lệnh. Để làm việc này, bạn cần đảm bảo rằng việc Listsử dụng được khởi tạo trước khi bất kỳ chế độ xem nào được thực thi. Sau đó, bạn có thể thực hiện những việc như thế này ở đầu mỗi chế độ xem / một phần (mà không cần quan tâm nếu giá trị Scriptshoặc Styleslà null:

ViewBag.Scripts.Add("myscript.js");
ViewBag.Styles.Add("mystyle.css");

Trong bố cục, sau đó bạn có thể lặp qua các bộ sưu tập và thêm các kiểu dựa trên các giá trị trong List.

@foreach (var script in ViewBag.Scripts)
{
    <script type="text/javascript" src="@script"></script>
}
@foreach (var style in ViewBag.Styles)
{
    <link href="@style" rel="stylesheet" type="text/css" />
}

Tôi nghĩ nó xấu, nhưng đó là thứ duy nhất hoạt động.

****** CẬP NHẬT **** Vì nó bắt đầu thực hiện các chế độ xem bên trong trước và tìm đường đến bố cục và các kiểu CSS đang xếp tầng, nên có thể có ý nghĩa để đảo ngược danh sách kiểu thông qua ViewBag.Styles.Reverse().

Bằng cách này, phong cách bên ngoài nhất được thêm vào đầu tiên, phù hợp với cách thức các biểu định kiểu CSS hoạt động.


1
Cảm ơn ntziolis. Nó trông có vẻ tốt nhưng, các đầu bố trí dao cạo hoạt động trước tiên trước các chế độ xem khác, và động lực học mô tả và .ststyle trống rỗng trước các chế độ xem khác. Tôi tìm thấy blog tốt đẹp về nó và tôi đã chia sẻ câu hỏi này.
Nuri YILMAZ

Điều này sẽ làm việc cho bất kỳ chế độ xem xuất phát nhưng không cho các phần. Đối với partials thực sự thứ tự thực hiện là sai. về cơ bản đối với các hạt không có cách nào để đưa chúng vào tiêu đề. Tôi sẽ đề nghị, thay vì thêm nó vào tiêu đề, chỉ cần thêm nó vào đầu thẻ body. Nó không phải là lựa chọn đầu tiên của tôi, nhưng theo cách này bạn có cách quản lý ngắn gọn tất cả các kiểu / js ở một nơi, thay vào đó làm phân tán chúng xung quanh.
ntziolis

Tôi đồng ý với bạn. Bởi vì tôi tìm thấy một số giải pháp như tôi đã liệt kê trên câu trả lời nhưng nó chính xác là giải pháp js. Tôi thực sự tự hỏi tại sao chúng ta không thể sử dụng trang bố cục như asp.net clasic. Nó có nghĩa là tôi có thể đạt đến đầu từ trang con.
Nuri YILMAZ

11

Bạn có thể xác định phần bằng RenderSection phương thức trong bố cục.

Bố trí

<head>
  <link href="@Url.Content("~/Content/themes/base/Site.css")"
    rel="stylesheet" type="text/css" />
  @RenderSection("heads", required: false)
</head>

Sau đó, bạn có thể bao gồm các tệp css của mình trong khu vực phần trong chế độ xem của bạn ngoại trừ chế độ xem một phần .

Phần làm việc trong chế độ xem, nhưng không hoạt động trong chế độ xem một phần theo thiết kế .

<!--your code -->
@section heads
{
  <link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
  rel="stylesheet" type="text/css" />
}

Nếu bạn thực sự muốn sử dụng diện tích phần trong chế độ xem một phần, bạn có thể theo dõi bài viết để xác định lại phương thức RenderSection.

Dao cạo, bố cục lồng nhau và các phần được xác định lại - Marcin trên ASP.NET


6

Tôi đã có một vấn đề tương tự, và cuối cùng đã áp dụng câu trả lời tuyệt vời của Kalman với đoạn mã dưới đây (không hoàn toàn gọn gàng, nhưng có thể mở rộng hơn nhiều):

namespace MvcHtmlHelpers
{
    //http://stackoverflow.com/questions/5110028/add-css-or-js-files-to-layout-head-from-views-or-partial-views#5148224
    public static partial class HtmlExtensions
    {
        public static AssetsHelper Assets(this HtmlHelper htmlHelper)
        {
            return AssetsHelper.GetInstance(htmlHelper);
        }
    }
    public enum BrowserType { Ie6=1,Ie7=2,Ie8=4,IeLegacy=7,W3cCompliant=8,All=15}
    public class AssetsHelper
    {
        public static AssetsHelper GetInstance(HtmlHelper htmlHelper)
        {
            var instanceKey = "AssetsHelperInstance";
            var context = htmlHelper.ViewContext.HttpContext;
            if (context == null) {return null;}
            var assetsHelper = (AssetsHelper)context.Items[instanceKey];
            if (assetsHelper == null){context.Items.Add(instanceKey, assetsHelper = new AssetsHelper(htmlHelper));}
            return assetsHelper;
        }
        private readonly List<string> _styleRefs = new List<string>();
        public AssetsHelper AddStyle(string stylesheet)
        {
            _styleRefs.Add(stylesheet);
            return this;
        }
        private readonly List<string> _scriptRefs = new List<string>();
        public AssetsHelper AddScript(string scriptfile)
        {
            _scriptRefs.Add(scriptfile);
            return this;
        }
        public IHtmlString RenderStyles()
        {
            ItemRegistrar styles = new ItemRegistrar(ItemRegistrarFormatters.StyleFormat,_urlHelper);
            styles.Add(Libraries.UsedStyles());
            styles.Add(_styleRefs);
            return styles.Render();
        }
        public IHtmlString RenderScripts()
        {
            ItemRegistrar scripts = new ItemRegistrar(ItemRegistrarFormatters.ScriptFormat, _urlHelper);
            scripts.Add(Libraries.UsedScripts());
            scripts.Add(_scriptRefs);
            return scripts.Render();
        }
        public LibraryRegistrar Libraries { get; private set; }
        private UrlHelper _urlHelper;
        public AssetsHelper(HtmlHelper htmlHelper)
        {
            _urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
            Libraries = new LibraryRegistrar();
        }
    }
    public class LibraryRegistrar
    {
        public class Component
        {
            internal class HtmlReference
            {
                internal string Url { get; set; }
                internal BrowserType ServeTo { get; set; }
            }
            internal List<HtmlReference> Styles { get; private set; }
            internal List<HtmlReference> Scripts { get; private set; }
            internal List<string> RequiredLibraries { get; private set; }

            public Component()
            {
                Styles = new List<HtmlReference>();
                Scripts = new List<HtmlReference>();
                RequiredLibraries = new List<string>();
            }
            public Component Requires(params string[] libraryNames)
            {
                foreach (var lib in libraryNames)
                {
                    if (!RequiredLibraries.Contains(lib))
                        { RequiredLibraries.Add(lib); }
                }
                return this;
            }
            public Component AddStyle(string url, BrowserType serveTo = BrowserType.All)
            {
                Styles.Add(new HtmlReference { Url = url, ServeTo=serveTo });
                return this;
            }
            public Component AddScript(string url, BrowserType serveTo = BrowserType.All)
            {
                Scripts.Add(new HtmlReference { Url = url, ServeTo = serveTo });
                return this;
            }
        }
        private readonly Dictionary<string, Component> _allLibraries = new Dictionary<string, Component>();
        private List<string> _usedLibraries = new List<string>();
        internal IEnumerable<string> UsedScripts()
        {
            SetOrder();
            var returnVal = new List<string>();
            foreach (var key in _usedLibraries)
            {
                returnVal.AddRange(from s in _allLibraries[key].Scripts
                                   where IncludesCurrentBrowser(s.ServeTo)
                                   select s.Url);
            }
            return returnVal;
        }
        internal IEnumerable<string> UsedStyles()
        {
            SetOrder();
            var returnVal = new List<string>();
            foreach (var key in _usedLibraries)
            {
                returnVal.AddRange(from s in _allLibraries[key].Styles
                                   where IncludesCurrentBrowser(s.ServeTo)
                                   select s.Url);
            }
            return returnVal;
        }
        public void Uses(params string[] libraryNames)
        {
            foreach (var name in libraryNames)
            {
                if (!_usedLibraries.Contains(name)){_usedLibraries.Add(name);}
            }
        }
        public bool IsUsing(string libraryName)
        {
            SetOrder();
            return _usedLibraries.Contains(libraryName);
        }
        private List<string> WalkLibraryTree(List<string> libraryNames)
        {
            var returnList = new List<string>(libraryNames);
            int counter = 0;
            foreach (string libraryName in libraryNames)
            {
                WalkLibraryTree(libraryName, ref returnList, ref counter);
            }
            return returnList;
        }
        private void WalkLibraryTree(string libraryName, ref List<string> libBuild, ref int counter)
        {
            if (counter++ > 1000) { throw new System.Exception("Dependancy library appears to be in infinate loop - please check for circular reference"); }
            Component library;
            if (!_allLibraries.TryGetValue(libraryName, out library))
                { throw new KeyNotFoundException("Cannot find a definition for the required style/script library named: " + libraryName); }
            foreach (var childLibraryName in library.RequiredLibraries)
            {
                int childIndex = libBuild.IndexOf(childLibraryName);
                if (childIndex!=-1)
                {
                    //child already exists, so move parent to position before child if it isn't before already
                    int parentIndex = libBuild.LastIndexOf(libraryName);
                    if (parentIndex>childIndex)
                    {
                        libBuild.RemoveAt(parentIndex);
                        libBuild.Insert(childIndex, libraryName);
                    }
                }
                else
                {
                    libBuild.Add(childLibraryName);
                    WalkLibraryTree(childLibraryName, ref libBuild, ref counter);
                }
            }
            return;
        }
        private bool _dependenciesExpanded;
        private void SetOrder()
        {
            if (_dependenciesExpanded){return;}
            _usedLibraries = WalkLibraryTree(_usedLibraries);
            _usedLibraries.Reverse();
            _dependenciesExpanded = true;
        }
        public Component this[string index]
        {
            get
            {
                if (_allLibraries.ContainsKey(index))
                    { return _allLibraries[index]; }
                var newComponent = new Component();
                _allLibraries.Add(index, newComponent);
                return newComponent;
            }
        }
        private BrowserType _requestingBrowser;
        private BrowserType RequestingBrowser
        {
            get
            {
                if (_requestingBrowser == 0)
                {
                    var browser = HttpContext.Current.Request.Browser.Type;
                    if (browser.Length > 2 && browser.Substring(0, 2) == "IE")
                    {
                        switch (browser[2])
                        {
                            case '6':
                                _requestingBrowser = BrowserType.Ie6;
                                break;
                            case '7':
                                _requestingBrowser = BrowserType.Ie7;
                                break;
                            case '8':
                                _requestingBrowser = BrowserType.Ie8;
                                break;
                            default:
                                _requestingBrowser = BrowserType.W3cCompliant;
                                break;
                        }
                    }
                    else
                    {
                        _requestingBrowser = BrowserType.W3cCompliant;
                    }
                }
                return _requestingBrowser;
            }
        }
        private bool IncludesCurrentBrowser(BrowserType browserType)
        {
            if (browserType == BrowserType.All) { return true; }
            return (browserType & RequestingBrowser) != 0;
        }
    }
    public class ItemRegistrar
    {
        private readonly string _format;
        private readonly List<string> _items;
        private readonly UrlHelper _urlHelper;

        public ItemRegistrar(string format, UrlHelper urlHelper)
        {
            _format = format;
            _items = new List<string>();
            _urlHelper = urlHelper;
        }
        internal void Add(IEnumerable<string> urls)
        {
            foreach (string url in urls)
            {
                Add(url);
            }
        }
        public ItemRegistrar Add(string url)
        {
            url = _urlHelper.Content(url);
            if (!_items.Contains(url))
                { _items.Add( url); }
            return this;
        }
        public IHtmlString Render()
        {
            var sb = new StringBuilder();
            foreach (var item in _items)
            {
                var fmt = string.Format(_format, item);
                sb.AppendLine(fmt);
            }
            return new HtmlString(sb.ToString());
        }
    }
    public class ItemRegistrarFormatters
    {
        public const string StyleFormat = "<link href=\"{0}\" rel=\"stylesheet\" type=\"text/css\" />";
        public const string ScriptFormat = "<script src=\"{0}\" type=\"text/javascript\"></script>";
    }
}

Dự án chứa một phương thức AssignAllResource tĩnh:

assets.Libraries["jQuery"]
        .AddScript("~/Scripts/jquery-1.10.0.min.js", BrowserType.IeLegacy)
        .AddScript("~/Scripts//jquery-2.0.1.min.js",BrowserType.W3cCompliant);
        /* NOT HOSTED YET - CHECK SOON 
        .AddScript("//ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js",BrowserType.W3cCompliant);
        */
    assets.Libraries["jQueryUI"].Requires("jQuery")
        .AddScript("//ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js",BrowserType.Ie6)
        .AddStyle("//ajax.aspnetcdn.com/ajax/jquery.ui/1.9.2/themes/eggplant/jquery-ui.css",BrowserType.Ie6)
        .AddScript("//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js", ~BrowserType.Ie6)
        .AddStyle("//ajax.aspnetcdn.com/ajax/jquery.ui/1.10.3/themes/eggplant/jquery-ui.css", ~BrowserType.Ie6);
    assets.Libraries["TimePicker"].Requires("jQueryUI")
        .AddScript("~/Scripts/jquery-ui-sliderAccess.min.js")
        .AddScript("~/Scripts/jquery-ui-timepicker-addon-1.3.min.js")
        .AddStyle("~/Content/jQueryUI/jquery-ui-timepicker-addon.css");
    assets.Libraries["Validation"].Requires("jQuery")
        .AddScript("//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js")
        .AddScript("~/Scripts/jquery.validate.unobtrusive.min.js")
        .AddScript("~/Scripts/mvcfoolproof.unobtrusive.min.js")
        .AddScript("~/Scripts/CustomClientValidation-1.0.0.min.js");
    assets.Libraries["MyUtilityScripts"].Requires("jQuery")
        .AddScript("~/Scripts/GeneralOnLoad-1.0.0.min.js");
    assets.Libraries["FormTools"].Requires("Validation", "MyUtilityScripts");
    assets.Libraries["AjaxFormTools"].Requires("FormTools", "jQueryUI")
        .AddScript("~/Scripts/jquery.unobtrusive-ajax.min.js");
    assets.Libraries["DataTables"].Requires("MyUtilityScripts")
        .AddScript("//ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js")
        .AddStyle("//ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables.css")
        .AddStyle("//ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/css/jquery.dataTables_themeroller.css");
    assets.Libraries["MvcDataTables"].Requires("DataTables", "jQueryUI")
        .AddScript("~/Scripts/jquery.dataTables.columnFilter.min.js");
    assets.Libraries["DummyData"].Requires("MyUtilityScripts")
        .AddScript("~/Scripts/DummyData.js")
        .AddStyle("~/Content/DummyData.css");     

trong trang _layout

@{
    var assets = Html.Assets();
    CurrentResources.AssignAllResources(assets);
    Html.Assets().RenderStyles()
}
</head>
...
    @Html.Assets().RenderScripts()
</body>

và trong một phần (s) và lượt xem

Html.Assets().Libraries.Uses("DataTables");
Html.Assets().AddScript("~/Scripts/emailGridUtilities.js");

Hấp dẫn. Có vẻ như quá mức cần thiết, nhưng tôi thấy điều này được sử dụng nhiều hơn với các trang web không có sự lựa chọn, nhưng để đối phó với người dùng sử dụng các phiên bản cũ hơn ... như trong môi trường công ty nơi một số quốc gia chưa nâng cấp và bạn muốn tự bắn. cười lớn. +1 cho điều đó
pqsk

5

Tôi đã cố gắng giải quyết vấn đề này.

Câu trả lời của tôi là ở đây.

"DynamicHeader" - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DocateHeader

Ví dụ: _Layout.cshtml là:

<head>
@Html.DynamicHeader()
</head>
...

Và, bạn có thể đăng ký các tệp .js và .css vào "DynamicHeader" bất cứ nơi nào bạn muốn.

Đối với exmaple, khối mã trong AnotherPartial.cshtm là:

@{
  DynamicHeader.AddSyleSheet("~/Content/themes/base/AnotherPartial.css");
  DynamicHeader.AddScript("~/some/myscript.js");
}

Sau đó, HTML đầu ra cuối cùng là:

<html>
  <link href="/myapp/Content/themes/base/AnotherPartial.css" .../>
  <script src="/myapp/some/myscript.js" ...></script>
</html>
...

4

Hãy thử giải pháp vượt trội (ASP.NET MVC 4 trở lên):

@{
    var bundle = BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/js");

    bundle.Include("~/Scripts/myFile.js");
}

Tôi đang gặp lỗi:CS0103: The name 'BundleTable' does not exist in the current context
Kunal

nvm: đã giải quyết nó. Phải nối thêm System.Web.Optimizationtức làSystem.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Kunal

1
Điều này không sửa đổi các gói trên toàn cầu? Nếu bạn làm điều này trên trang A và sau đó mở trang B, trang B cũng sẽ có myFile.js bao gồm mà tôi không nghĩ rằng bị truy nã bởi OP
miles82

4

Đối với những người trong chúng ta sử dụng ASP.NET MVC 4 - điều này có thể hữu ích.

Đầu tiên, tôi đã thêm một lớp BundleConfig trong thư mục App_Start.

Đây là mã của tôi mà tôi đã sử dụng để tạo nó:

using System.Web.Optimization;

public class BundleConfig
{
    public static void RegisterBundles(BundleCollection bundles)
    {
        bundles.Add(new StyleBundle("~/Content/css").Include("~/Content/SiteMaster.css"));
    }
}

Thứ hai, tôi đã đăng ký lớp BundleConfig trong tệp Global.asax:

protected void Application_Start()
{
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Thứ ba, tôi đã thêm các trình trợ giúp kiểu vào tệp CSS của mình:

/* Styles for validation helpers */
.field-validation-error {
    color: red;
    font-weight: bold;
}

.field-validation-valid {
    display: none;
}

input.input-validation-error {
    border: 1px solid #e80c4d;
}

input[type="checkbox"].input-validation-error {
    border: 0 none;
}

.validation-summary-errors {
    color: #e80c4d;
    font-weight: bold;
    font-size: 1.1em;
}

.validation-summary-valid {
    display: none;
}

Cuối cùng tôi đã sử dụng cú pháp này trong bất kỳ Chế độ xem nào:

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

3

Đây là một plugin NuGet có tên là Cassette , trong số những thứ khác cung cấp cho bạn khả năng tham chiếu các tập lệnh và kiểu trong các phần.

Mặc dù có một số cấu hình có sẵn cho plugin này, điều này làm cho nó rất linh hoạt. Đây là cách đơn giản nhất để giới thiệu các tập tin tập lệnh hoặc biểu định kiểu:

Bundles.Reference("scripts/app");

Theo tài liệu :

Gọi đến Reference có thể xuất hiện ở bất cứ đâu trong một trang, bố cục hoặc chế độ xem một phần.

Đối số đường dẫn có thể là một trong những điều sau đây:

  • Một đường dẫn bó
  • Đường dẫn tài sản - toàn bộ gói chứa tài sản này được tham chiếu
  • Một URL

2

Tôi đã viết một trình bao bọc dễ dàng cho phép bạn đăng ký các kiểu và các đoạn mã trong mọi chế độ xem một cách linh hoạt vào thẻ đầu.

Nó dựa trên jsakamoto DynamicHeader đưa ra, nhưng nó có một số cải tiến & cải tiến hiệu suất.

Nó rất dễ sử dụng, và linh hoạt.

Việc sử dụng:

@{
    DynamicHeader.AddStyleSheet("/Content/Css/footer.css", ResourceType.Layout);    
    DynamicHeader.AddStyleSheet("/Content/Css/controls.css", ResourceType.Infrastructure);
    DynamicHeader.AddScript("/Content/Js/Controls.js", ResourceType.Infrastructure);
    DynamicHeader.AddStyleSheet("/Content/Css/homepage.css");    
}

Bạn có thể tìm thấy mã đầy đủ, giải thích và ví dụ bên trong: Thêm kiểu & tập lệnh động vào thẻ Head

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.