ASP.NET авторазрешение URL MVC в файлах CSS

Возможно, этот ответ относится к вашему вопросу: Есть ли причина, по которой модуль-шаблон по умолчанию не привязан к полям?

Обратите внимание на DefaultModelBinder , ModelBinderContext , ModelMetadata . Это все объясняет.

27
задан chakrit 6 November 2008 в 19:11
поделиться

6 ответов

Я не обеспокоился бы символом auto-root-finding ~. Я понимаю, что Вы хотите то же решение работать, где корневой каталог отличается между развертыванием, но в рамках документа CSS у Вас не должно быть проблем с помощью относительных путей. Пути в документе CSS (к URL изображения в Вашем примере) всегда будут относительно местоположения файла CSS независимо от пути любой страницы, которая загружает тот файл CSS. Таким образом, если Ваши изображения будут в ~/Content/Images, и Ваши таблицы стилей находятся в ~/Content/Stylesheets, Вы всегда будете в состоянии использовать background-image: url(../Images/form_bg.gif);, и это будет работать независимо от местоположения страницы, которая загружает таблицу стилей.

там причина, это не работало бы?

46
ответ дан David Kolar 14 October 2019 в 13:36
поделиться

Здесь [приблизительно 112] ресурсы при реализации IHttpModule для прерывания веб-запросов к приложению...

Пишут/адаптируют для проверки на тип файла (например, псевдокод: если (концы запроса с ".css")...)

тогда используют регулярное выражение для замены всех экземпляров "~ /" с Системой. Сеть. VirtualPathUtility. ToAbsolute (" ~ / ")

я не знаю то, что это сделает к производительности, выполнение каждого запроса через это своего рода фильтрует, но можно, вероятно, играть с web.config файлом, и/или маршруты URL MVC для направления всех запросов .css через это своего рода фильтруют при пропуске мимо него для других файлов.

Задумываются о нем, можно, вероятно, достигнуть того же эффекта в приложении MVC ASP.NET путем указания на все ссылки CSS на специальный controller.action, который выполняет этот вид предварительной обработки для Вас. я сомневаюсь, что это было бы столь же производительно как IHttpModule все же.

4
ответ дан David Alpert 14 October 2019 в 13:36
поделиться

Один прием, который я использовал в прошлом, должен был на самом деле заставить мой файл CSS иметь.ASPX расширение и установить свойство ContentType в подписи страницы:

<%@ Page Language="C#" ContentType="text/css" %>

body {
    margin: 0;
    padding: 0;
    background: #C32605 url(<%= ResolveUrl("~/Content/themes/base/images/BodyBackground.png") %>) repeat-x;
    font-family: Verdana, Arial, sans-serif;
    font-size: small;
    color: #d7f9ff;
}

Это гарантирует, что файл CSS проходит платформу ASP.NET и заменяет серверный код Вашим относительным путем.

5
ответ дан David P 14 October 2019 в 13:36
поделиться

Вы могли использовать URL Rewriter для фиксации URL, поскольку запрос входит, хотя я не так уверен, что это так изящно как взлом в этом случае.

0
ответ дан Greg Ogle 14 October 2019 в 13:36
поделиться

При попытке проанализировать ~ / из какого-либо файла, включая текстовые файлы, JavaScript, и т.д., можно записать обработчик, который присваивает фильтр ему, и можно использовать это для поиска тех путей..., например...

public class StringParsingFilter : MemoryStream {

    public Stream OriginalStream {
        get { return this.m_OriginalStream; }
        set { this.m_OriginalStream = value; }
    }
    private System.IO.Stream m_OriginalStream;

    public StringParsingFilter() : base() {
        this.m_OriginalStream = null;
    }

    public override void Flush() {
        this.m_OriginalStream.Flush();
    }

    public override void Write(byte[] buffer, int offset, int count) {

        //otherwise, parse for the correct content
        string value = System.Text.Encoding.Default.GetString(buffer);
        string contentType = HttpContext.Current.Response.ContentType;

        //Do any parsing here
        ...

        //write the new bytes to the stream
        byte[] bytes = System.Text.Encoding.Default.GetBytes(value);
        this.m_OriginalStream.Write(bytes, offset, count + (bytes.Length - buffer.Length));

    }

}

И Вы запишете пользовательский обработчик для знания, когда присвоить этот фильтр... как следующее...

 public class FilterControlModule : IHttpModule {

    public void Init(HttpApplication context) {
        HttpApplication oAppContext = context;
        oAppContext.BeginRequest += new EventHandler(_HandleSettingFilter);                        
    }

    private void _HandleSettingFilter(object sender, EventArgs e) {

        //You might check the file at this part to make sure
        //it is a file type you want to parse
        //if (!CurrentFile.isStyleSheet()) { return; }
        ...

        //assign the new filter
        StringParsingFilter filter = new StringParsingFilter();
        filter.OriginalStream = HttpContext.Current.Response.Filter;
        HttpContext.Current.Response.Filter = (Stream)filter;

    }

}

, возможно, на самом деле было легче только сказать, "ищут IHttpModules", но это - некоторый код, что я раньше анализировал файлы для путей кроме файлов ASP.net.

необходимо будет также изменить некоторые вещи в настройках IIS, чтобы позволить файлам быть проанализированными путем установки ISAPI ASP.net, чтобы быть подстановочным знаком для всех файлов, которые обрабатываются. Вы видите больше в этом веб-сайте при использовании IIS6, который является...

можно также использовать это для изменения любых типов файлов, таким образом, Вы могли присвоить некоторые фильтры для изображений, некоторых для JavaScript или таблиц стилей или... действительно чего-либо...

1
ответ дан Hugoware 14 October 2019 в 13:36
поделиться

Я создал класс утилит PathHelper, который дает мне все необходимые мне пути. Например,

<link href="<%=PathHelper.CssUrl("FormulaIndex.css")%>" rel="Stylesheet" type="text/css"/>

Дает мне правильный полный URL-адрес с помощью System.Web.VirtualPathUtility.ToAbsolute () и моего собственного соглашения (content / css / yourFile.css).

Я сделал то же самое для js, xml, t9n, pics ... Его центральное, многоразовое использование, и теперь мне нужно было всего лишь изменить одну строку, чтобы поймать перемещение папки scripts из content / js в Scripts на всех моих сайтах и стр.

Идиотский ход, если вы спросите меня, но это реальность в текущей бета-версии: (

0
ответ дан Boris Callens 14 October 2019 в 13:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: