2010-01-20 48 views
11

我有一个母版页位于/ Views/Shared中。主页面引用/Content文件夹中的样式表。ASP.NET MVC - 在母版页中引用样式表

如果我使用"../../Content/style.css"来引用样式表,一切正常。但是,我的Web应用程序不在我们的生产环境的根文件夹中,所以相对路径不起作用。我试过了“<%= ResolveUrl(”〜/ content/style.css“)%>”它可以在生产场景中工作,但是然后Visual Studio中的设计者抱怨我的类错了(而且我无法在设计选项卡中使用CSS预览页面)。

是否有解决方案,使这项工作在两种情况下?我通过编写重置链接标记的服务器端代码在WebForms中完成了此操作。我可以在这里做到这一点,但我想避免它。

+0

*“我的web应用程序不在根文件夹中”* ...相对路径不引用根文件夹,所以我不确定为什么这会起作用。您确定您的内容文件夹在生产服务器上位于相同的**相对**位置吗? – 2010-01-20 19:02:06

+0

生产和开发中的相对路径相同。相对于母版页的相对路径是正确的。但是,该路径与使用母版页的页面不相关,母版页是用户浏览器使用的路径。 – 2010-01-21 03:19:44

回答

8

试试这个技巧 - 包括你的样式表都有的方法。包括一个具有Visual Studio将用于设计时支持的固定路径引用,但将其包含在服务器端注释中,以便在运行时不实际包含它。第二个参考是在运行时使用的“真实”引用,并且使用Url.Content(),无论您的应用程序是否为子目录,它都可以工作。

<% /* %> 
    <link href="../../Content/Site.css" rel="stylesheet" type="text/css" /> 
<% */ %> 

<link href="<%=Url.Content("~/Content/Site.css") %>" rel="stylesheet" 
     type="text/css" /> 
+0

+1有趣的技术!我也会使用T4MVC来做到这一点。 – 2010-01-20 19:53:39

+0

我喜欢这个想法。这是一个解决方法,但它同时满足两个要求。如果ASPX设计师在预览页面时解析服务器端代码将会很好。 – 2010-01-21 03:24:02

+0

您也可以使静态链接runat =“server”visible =“false”,这更简单一些。 – 2010-04-14 15:49:43

6

最好的做法是Extend the URL Helper。这使您可以轻松地从视图中调用它,并且如果您的结构或文件发生更改,则无需进行大规模查找/替换。

public static string Image(this UrlHelper helper, string fileName) 
{ 
    return helper.Content("~/Content/Images/" + fileName)); 
} 

public static string Stylesheet(this UrlHelper helper, string fileName) 
{ 
    return helper.Content("~/Content/Stylesheets/" + fileName); 
} 

public static string Script(this UrlHelper helper, string fileName) 
{ 
    return helper.Content("~/Content/Scripts/" + fileName); 
} 

    <link href="<%= UrlHelper.Stylesheet("Main.css")%>" rel="stylesheet" 
     type="text/css" /> 
+0

为什么这是最佳做法? – 2010-01-20 19:11:30

+0

,以便您可以轻松地在您的视图中查看它,如果有任何更改,则不必执行查找/替换。 – Martin 2010-01-20 19:22:06

+0

我明白你的观点,但它并不能解决VS设计师无法解决CSS位置的问题。 – 2010-01-21 03:27:25

0

在Views文件夹中,然后进入Shared文件夹有助于理解如何在MVC中引用CSS文件。