2011-02-24 117 views
155

布局页头:CSS或JavaScript文件从视图或局部视图添加到布局头部

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

视图(AnotherView)从应用需求:

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

和AnotherView有局部视图(AnotherPartial)哪需要:

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

问题:我们怎样才能这些CSS文件链接AnotherView和AnotherPartial链接布局头

RenderSection不是一个好主意,因为AnotherPage可以有多个Partials。将所有CSS添加到头部是没有用的,因为它会改变动态(取决于Anotherpages)。

+0

@NuriYILMAZ它的“从意见”和“或部分意见”,按您的标题说,之间的巨大差异。无论如何,关于这个问题的任何新想法? – Shimmy 2012-11-26 09:55:32

回答

11

不幸的是,这是不可能的作为另一个用户建议使用section,因为section仅适用于View的立即child

但是什么工作是实施,并在每个视图重新定义section,意思是:

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

这样每个视图可以实现头部分,而不仅仅是眼前的孩子。这只能部分起作用,尤其是在多重局部麻烦开始时(正如你在你的问题中提到的那样)。

因此,您的问题唯一真正的解决方案是使用ViewBag。最好的可能是CSS和脚本的单独集合(列表)。为此,您需要确保在执行任何视图之前使用List进行了初始化。然后,你可以可以做这样的事情在每个视图顶部/分(不含照顾,如果ScriptsStyles值为null:那么你可以通过收集循环,并添加样式基于

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

在布局在

@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" /> 
} 

List值。我认为这是丑陋的,但它是唯一可行的事情。

****** UPDATE **** 由于开始执行首先内部视图,并按照布局工作,CSS样式是级联的,但通过ViewBag.Styles.Reverse()反转样式列表可能是有意义的。

通过这种方式,首先添加了最外面的样式,这与CSS样式表工作方式无关。

+1

谢谢ntziolis。它看起来不错,但剃刀布局首先在另一个视图之前工作,并且.scripts和.styles动态在另一个视图之前是空的。我发现了很好的博客,我分享了这个问题。 – 2011-02-25 01:44:02

+0

这将适用于任何派生*视图,但不适用于部分。对于部分来说,执行的顺序确实是错误的。基本上对于部分来说,没有办法将它们包含到标题中。我会建议,而不是将其添加到标题,只需将其添加到身体标记的开头。这不会是我的第一选择,但这样你就可以在一个地方管理所有样式/ j的简明方式,而不是将它们分散到各处。 – ntziolis 2011-02-25 08:38:45

+0

我很高兴与你同在。因为我在答案中列出了一些解决方案,但它完全是js解决方案。我真的很想知道为什么我们不能使用布局页面作为clasic asp.net。这意味着我可以从儿童页面开始接触。 – 2011-02-27 14:32:48

68

更新:在https://github.com/speier/mvcassetshelper

提供基本的例子中,我们使用以下实施JS和CSS文件添加到页面布局。

查看或PartialView:

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

布局页:

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

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

的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>"; 
} 
+0

嗨卡尔曼!这是另一个好的解决方案。我会尝试其中的一个为我的应用程序。 :)我更喜欢你的代码,因为它是“纯代码”。谢谢。 – 2011-03-01 15:48:57

+0

此解决方案的一个问题......它不保持我称之为加载脚本的顺序。其实他们是颠倒的顺序。 – JBeckton 2011-03-16 00:43:11

+2

@JBeckton:看看代码并用'Add'方法替换'Insert'方法 – 2011-07-06 05:48:30

184

布局:

<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> 

查看:

@model ProjectsExt.Models.DirectoryObject 

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

我认为这是最简单的解决方案。 – iamichi 2012-05-24 10:01:44

+0

不错的解决方案! – jerrylroberts 2012-08-09 16:46:24

+0

伟大的解决方案! – 2012-08-29 11:10:26

5

我试图解决这个问题。

我的答案在这里。

“DynamicHeader” - http://dynamicheader.codeplex.com/https://nuget.org/packages/DynamicHeader

例如,_Layout.cshtml是:

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

而且,你可以注册的.js和.css文件 “DynamicHeader” 你想随时随地

对于〔实施例,在AnotherPartial.cshtm代码块是:

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

然后,finaly输出HTML是:

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

我也有类似的问题,并最终将卡尔曼的出色答卷与下面的代码(不完全一样,但可以说更可扩展):

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>"; 
    } 
} 

该项目c ontains静态AssignAllResources方法:

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");  

在_layout页

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

,并在部分(S)和看法

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

有趣。看起来像过度杀伤,但我确实看到这被更多的用于没有选择的网站,而是用来处理使用旧版ie的用户......就像在一些国家尚未升级的企业环境中,并且您想拍摄自己。大声笑。 +1 – pqsk 2013-12-20 15:16:51

2

我写了一个简单的包装,使您注册样式和每个局部视图中的脚本动态添加到头标记中。

它是基于DynamicHeader jsakamoto忍受,但它有一些性能改善&调整。

这是非常容易使用,多功能。

用法:

@{ 
    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");  
} 

你可以发现里面的全部代码,解释和例子: Add Styles & Scripts Dynamically to Head Tag

3

这里是一个NuGet插件叫做Cassette,其中除其他事项外为您提供参考的能力脚本和部分样式。

虽然有a number of configurations可用于此插件,这使得它非常灵活。这里是指脚本或样式表文件,最简单的方法:

Bundles.Reference("scripts/app"); 

根据the documentation

Calls to Reference can appear anywhere in a page, layout or partial view.

The path argument can be one of the following:

  • A bundle path
  • An asset path - the whole bundle containing this asset is referenced
  • A URL
4

尝试出的现成的解决方案(ASP.NET MVC 4或更高版本):

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

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

我收到一个错误:'CS0103:名称'BundleTable'在当前上下文中不存在' – Kunal 2017-09-19 19:54:31

+0

nvm:解决它。必须追加'System.Web.Optimization'即ie System.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles()。首先(b => b.Path ==“〜/ bundles/css”);' – Kunal 2017-09-19 19:56:44

+0

这应该是ASP.NET 4.5接受的答案 – Kunal 2017-09-19 19:57:24

4

对于我们这些使用ASP.NET MVC 4的人来说 - 这可能会有帮助。

首先,我在App_Start文件夹中添加了一个BundleConfig类。

这里是我的代码,我用来创建它:

using System.Web.Optimization; 

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

第二,我注册了BundleConfig类Global.asax文件:

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

第三,我添加的风格助手到我的CSS文件:

/* 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; 
} 

最后,我在任何视图中使用此语法:

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

您可以通过RenderSection定义部分布局中的方法。

布局

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

然后您可以在不同的局部视图视图在部分地区的css文件。

部分工作在视图中,但不能在部分视图中工作

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

如果你真的想在局部视图中使用部分面积,您可以按照文章重新定义RenderSection方法。

Razor, Nested Layouts and Redefined Sections – Marcin On ASP.NET