阻止MVC ViewMasterPage解析CSS URL

时间:2010-10-07 09:58:39

标签: asp.net-mvc master-pages

默认情况下,从网址/folderlevel1/folderlevel2/Site.master访问的.NET domain.com/urllevel1/urllevel2/中放置的.NET MVC2中的母版页将解析此标记中的网址:

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

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

这在我的多租户MVC应用中变得有问题。我想阻止这种行为。我希望母版页单独留下网址。

5 个答案:

答案 0 :(得分:5)

您可能遇到此问题,因为当您将head标记指定为服务器端控件时,ASP.NET会执行魔术操作:

<head runat="server">

这些技巧包括:

  • 解析相对CSS路径
  • 从视图的@Page指令
  • 填充标题和元标记

如果您不想要这些技巧,只需从runat标记中删除head属性:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html>
<html>
<head> 
    <link href="Content/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
...
</body>
</html>

答案 1 :(得分:1)

你可以使用

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

但这基本上总是转化为:

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

所以你不妨使用后者。

答案 2 :(得分:1)

就像Kazi的最佳实践条目(http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx)中提到的那样,忽略路由访问资源时。要做到这一点,它非常简单,效果很好。将以下内容添加到Global.asax

中的AddRoutes函数中
_routes.IgnoreRoute("assets/{*pathInfo}");

...其中“assets /”是您的内容文件夹(默认情况下是“内容”)

答案 3 :(得分:0)

的奥斯卡,

我确信会有很多类似的答案可以遵循,但标准方法是:

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

我当然可能错过了一些微妙的东西:)

答案 4 :(得分:0)

我建议使用HtmlHelper的扩展方法为您处理此任务。

using System.Web;
using System.Web.Mvc;

namespace MyApplicationNamepsace.Views
{
    public static class HtmlExtensions
    {

        public static IHtmlString RelativeCssLink(this HtmlHelper helper, string fileNameAndRelativePath)
        {
            TagBuilder builder = new TagBuilder("link");
            builder.Attributes.Add("rel", "stylesheet");
            builder.Attributes.Add("type", "text/css");
            builder.Attributes.Add("href", fileNameAndRelativePath);

            IHtmlString output = new HtmlString(builder.ToString());
            return output;
        }
    }
}

然后确保将名称空间添加到views文件夹中的web.config文件中。

<system.web>
  <pages>
    <namespaces>
      <add namespace="MyApplicationNamespace.Views"/>
    </namespaces>
  </pages>
</system.web>

然后在您的母版页中使用它。

<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <%: Html.RelativeCssLink("Content/Site.css") %>
</head>