문제

정상적인 WebForms 시나리오에서 모든 루트 관련 URL (예 : ~/폴더/file.txt) 내부에 다음과 같은 CSS 파일

.form { background-image: url(~/Content/Images/form_bg.gif); }

지정하면 런타임 중에 자동으로 해결됩니다

<head runat="server">

참조 페이지에서.

그러나 ASP.NET MVC Beta1 웹 사이트에서는 더 이상 일어나지 않습니다.

해킹이나 CSS- 로더 파일에 의지하지 않고이 기능을 활성화 할 수있는 방법이 있습니까? 아마도 httpmodules 또는 뭔가처럼?

아니면 내 웹 사이트를 올바르게 만들지 않습니까? 좋은 디자인은 무엇입니까?

원래 ASP.NET WebForms에는 이미이 기능이 있으므로 가능한 경우 기존 기능을 사용하는 것이 좋습니다. 그러나 나는 단서가 많지 않습니다.

이 웹 응용 프로그램은 ~ 루트 폴더가 명확하지 않은 여러 환경에 배포됩니다.


편집하다: 파일 내용의 URL은 파일의 URL 자체가 아닙니다.

도움이 되었습니까?

해결책

나는 자동 뿌리 찾기에 귀찮게하지 않을 것입니다 ~ 캐릭터. 루트 디렉토리가 배포마다 다른 곳에서 동일한 솔루션을 원하지만 CSS 문서 내에는 상대 경로를 사용하는 데 아무런 문제가 없어야합니다. CSS 문서의 경로 (예제의 이미지 URL에)는 CSS 파일을로드하는 페이지의 경로에 관계없이 항상 CSS 파일의 위치와 관련이 있습니다. 따라서 이미지가있는 경우 ~/Content/Images 그리고 당신의 스타일 시트가 있습니다 ~/Content/Stylesheets, 당신은 항상 사용할 수 있습니다 background-image: url(../Images/form_bg.gif); 그리고 스타일 시트를로드하는 페이지의 위치에 관계없이 작동합니다.

이것이 효과가없는 이유가 있습니까?

다른 팁

과거에 사용한 한 가지 요령 중 하나는 실제로 내 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 프레임 워크를 통과하고 서버 측 코드를 상대 경로로 대체 할 수 있습니다.

여기 ~이다 약간 자원 앱에 웹 요청을 가로 채기 위해 ihttpmodule 구현에 ...

Filetype를 확인하려면 하나를 쓰기/조정합니다 (예 : pseudocode : if (요청이 ".css") ...) ...)

그런 다음 정규 표현식을 사용하여 "~/"의 모든 인스턴스를 System.Web.VirtualPathutility.toAbsolute ( "~/")로 바꿉니다.

이런 종류의 필터를 통해 모든 요청을 실행하는 성능에 어떤 영향을 미칠지 모르겠지만 Web.config 파일 및/또는 MVC URL 경로를 사용하여 모든 .CSS 요청을 이런 종류의. 다른 파일을 위해 그것을 건너 뛰는 동안 필터.

이를 생각해보십시오. 특별한 컨트롤러에서 모든 CSS 굴절을 지적하여 ASP.NET MVC 앱 내에서 동일한 효과를 얻을 수 있습니다. 그래도 IHTTPModule만큼 성능이 있을지 의심됩니다.

당신이 구문 분석하려고한다면 ~/ 텍스트 파일, 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 설정에서 ASP.NET ISAPI를 처리하는 모든 파일의 와일드 카드로 설정하여 파일을 구문 분석 할 수 있도록 IIS 설정의 일부를 변경해야합니다. 더 많은 것을 볼 수 있습니다 이 웹 사이트에서, IIS6을 사용하는 경우 ...

또한이를 사용하여 모든 파일 유형을 수정하여 이미지, JavaScript 또는 스타일 시트에 대한 일부 필터를 할당 할 수 있습니다.

당신은 사용할 수 있습니다 URL Rewriter 요청이 발생할 때 URL을 고정하려면이 경우 해킹만큼 우아하지는 않습니다.

나는 필요한 모든 경로를 제공하는 Pathhelper Util 클래스를 만들었습니다. 예를 들어

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

System.web.virtualPathutility.toAbsolute () 및 내 자신의 규칙 (Content/CSS/Yourfile.css)의 도움으로 올바른 전체 URL을 제공합니다.

나는 JS, XML, T9N, Pics에 대해 동일한 작업을 수행했습니다. 중심, 재사용 가능하며 이제 모든 웹 사이트 및 페이지의 Content/JS에서 스크립트로 스크립트 폴더의 이동을 포착하기 위해 한 줄만 변경해야했습니다.

당신이 나에게 묻는다면 끔찍한 움직임이지만, 그것은 현재 베타에서 현실입니다 :(

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top