Остановка MVC ViewMasterPage от разрешения CSS-URL - PullRequest
1 голос
/ 07 октября 2010

По умолчанию главные страницы в .NET MVC2, расположенные следующим образом /folderlevel1/folderlevel2/Site.master, доступ к которым осуществляется с URL domain.com/urllevel1/urllevel2/, разрешат URL-адрес в этом теге:

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

до

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

Это становится проблематичным в моем мультитенантном приложении MVC. И я хочу остановить это поведение. Я хочу, чтобы главная страница оставила URL-адрес в покое.

Ответы [ 5 ]

5 голосов
/ 21 октября 2010

Возможно, у вас есть эта проблема, потому что ASP.NET выполняет фокусы, когда вы указываете тег head в качестве элемента управления на стороне сервера, например:

<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 голос
/ 25 октября 2010

Как упомянуто в записи о лучших практиках Kazi (http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx), игнорировать маршрутизацию при доступе к ресурсам. Для этого это очень просто и хорошо работает. Добавьте ниже к вашей функции AddRoutes в Global.asax

_routes.IgnoreRoute("assets/{*pathInfo}");

... где "assets /" - это папка вашего контента (по умолчанию это "Content")

1 голос
/ 21 октября 2010

вы можете использовать

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

но это в основном всегда означает:

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

так что вы могли бы просто использовать последний.

0 голосов
/ 21 октября 2010

Я предлагаю использовать метод расширения для 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;
        }
    }
}

Затем убедитесь, что вы добавили пространство имен в файл web.config в папке views.

<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>
0 голосов
/ 07 октября 2010
1000 * * оскар,

Я уверен, что будет много похожих ответов, но стандартным способом будет:

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

Я, возможно, здесь упустил что-то тонкое, конечно:)

...