ASP.Net 마스터 페이지 및 파일 경로 문제


78

모든 페이지에서 작동하도록 마스터 페이지에서 jQuery에 대한 스크립트 참조를 추가하려고합니다. 현재는 다음과 같습니다.

<script type="text/javascript" src="jquery.js"></script>

문제는 경로가 항상 실행중인 aspx 페이지에 상대적이므로 "jquery.js"파일이 동일한 폴더에있는 경우에만 작동한다는 것입니다. 작동하려면 라인을 다음과 같이 변경해야합니다.

<script type="text/javascript" src="../../jquery.js"></script>

이것은 루트 폴더에서 두 수준 깊이의 페이지에서만 작동하기 때문에 분명히 이상적이지 않습니다. 다음을 시도하면 IIS에서 예기치 않은 문자에 대한 오류가 발생합니다.

<script runat="server" type="text/javascript" src="~/jquery.js"></script>

어떤 아이디어?

편집 : 스크립트가 헤드 태그에 있어야 함을 언급하는 것을 잊었습니다 .

현재 최상위 답변은 마스터 페이지에 추가 할 때 " ASP.NET Ajax 클라이언트 측 프레임 워크를로드하지 못했습니다. "오류를 표시합니다. .Net 컴파일러가 아닌 javascript에서 발생합니다. ScriptManager를 헤드 섹션으로 이동하면 ScriptManager가 form 태그 안에 있어야한다는 컴파일 오류가 발생합니다.

세 번째 대답은 " 경로에 잘못된 문자가 있습니다. "컴파일러에서 예외가 발생 합니다.

편집 2 : 내 머리 태그에 해당 줄을 추가하면 IIS 에서이 오류가 발생합니다.

컨트롤에 코드 블록 (예 : <% ... %>)이 포함되어 있기 때문에 Controls 컬렉션을 수정할 수 없습니다.

해결 : 아래 답변에서 편집 된 응답을 가져 와서 asp : ContentPlaceHolder 요소에 넣었습니다 .


답변:


110

다음을 사용할 수 있습니다 ScriptManager.

<asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
        <asp:ScriptReference Path="~/jquery.js" />
    </Scripts>
</asp:ScriptManager>

편집 : 섹션 에서 절대적으로 필요한 경우 <head>다음과 같이 할 수 있습니다.

<head>
    <script type="text/javascript" 
        src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script>
</head>

편집 2 : 의견에 따르면 그것을 관찰하는 경우

컨트롤에 코드 블록 (예 : <% ... %>)이 포함되어 있기 때문에 Controls 컬렉션을 수정할 수 없습니다.

데이터 바인딩 구문을 사용하려면 위의 내용을 변경해야 할 수 있습니다.

<head>
    <script type="text/javascript" 
        src="<%# Page.ResolveClientUrl("~/jquery.js") %>"></script>
</head>

예, 이것은 마스터 페이지의 경로를 다룰 때 작성한 많은 ASP.NET 책에서 매우 권장되는 방법입니다.
Kezzer

참고로, 제 동료와 저는 이것을 시도했습니다. 이것은 상위 마스터 페이지 의 중첩 된 마스터 페이지 시나리오 에서 작동하지 않는 것 같습니다 . 그러나 하위 마스터 페이지로 이동하면 트릭이 발생했습니다.
technomalogical

3
이것은 거의 모든 내 페이지에서 저에게 효과가 있었지만, "컨트롤에 코드가 포함되어 있기 때문에 컨트롤 컬렉션을 수정할 수 없습니다"라는 특정 예외가 발생하는 2 페이지의 페이지에서 작동했습니다. 해결책은 헤더에있는 스크립트 포함을 response.write 코드 블록에서 데이터 바인드 평가자로 변경하는 것입니다 (예 : <% =에서 <% #으로 변경). 나는 http 헤더 공격을 막기 위해 MS의 일부 유형의 시도라고 추측 할 수 있습니다. :이 쉽게 수정의 더 나은 설명에서 찾을 수 있습니다 leedumond.com/blog/...
Jagd

사용 base href?
PreguntonCojoneroCabrón

@Jagd leedumond.com/blog/... 를 찾을 수 없습니다
PreguntonCojoneroCabrón

25

헤드 섹션 아래의 마스터 페이지 <%#대신 시도<%=

<script type="text/javascript" 
        src="<%# ResolveUrl("~/YourScriptFolder/YourJQueryOrJavascript.js") %>">
</script>

그런 다음 Page_Load이벤트 아래 마스터 페이지의 코드 비하인드에서

Page.Header.DataBind();

이제 ResolveUrlCSS, JavaScript, jQuery를 처리하려는 파일 의 경로를 변경하기 만하면 CSS뿐만 아니라 jQuery와 JavaScript를 사용할 수 있습니다 .


1
Page.Header.DataBind();저를 위해 작동 하려면 라인이 필요했습니다. 감사합니다!
Brendan Hannemann 2014 년

태그에 runat="server"속성 을 추가해야 할 수도 있습니다 head.
알렉스

11

asp : ScriptManager 또는 절대 경로에 가지 않으려면 다음과 같이 할 수 있습니다.

<script runat="server" type="text/javascript" 
  src='<%= Page.ResolveUrl("~/jquery.js") %>'></script>

3

나는 너희들이 당신의 문제에 대한 해결책을 찾았는지 여부를 모른다. 나는 같은 문제에 직면했고 내가 사용하는 플러그인에서 "jQuery is undefined"오류가 발생하는 이유를 알아 내기 위해 미쳐 버렸다. 나는 인터넷에서 얻은 모든 솔루션을 시도했지만 전혀 운이 없었습니다.

그러나 갑자기 스크립트 파일이 순서가 될 수있는 무언가가 내 마음에 스플래시됩니다. 그래서 jquery 참조를 첫 번째 위치로 옮겼고 모든 것이 매력처럼 작동하기 시작합니다.

jquery와 함께 플러그인을 사용하는 경우 해당 파일에 대한 참조를 설정하는 다음 순서를 사용하는지 확인하십시오.

  1. jquery 라이브러리에 대한 참조
  2. 다른 후속 플러그인 라이브러리에 대한 참조 등 ...

예 :

  1. "script src ="js / jquery-1.3.2.min.js "type ="text / javascript "...
  2. "script src ="js / jqDnR.min.js "type ="text / javascript "...
  3. "script src ="js / jquery.jqpopup.min.js "type ="text / javascript "...
  4. "script src ="js / jquery.bgiframe.min.js "type ="text / javascript "...

항상 jquery 참조를 먼저 넣은 다음 후속 라이브러리에 넣어야합니다.

희망, 이것은 특히 MasterPages와 함께 사용할 때 문제를 해결합니다. MasterPages를 사용하지 않을 때 사용하는 순서에 관계없이 작동하는 것이 매우 이상하지만 사용하면 어떻게 든 적절한 순서가 필요합니다.

행운과 행복한 코딩,

빈센트 디 수자


3

"/"루트를 실행하는 방법 . 이렇게하면 해결되지 않은 .js파일 경로 와 관련된 모든 문제가 해결 됩니다. 기본적으로 이름 확인이 IIS에서와 동일한 방식으로 작동하는 것과 localhost:port/달리 애플리케이션을 실행하도록 기본적으로 VS Dev 서버를 재구성합니다 localhost:port/application name/.


1

모든 페이지에 대한 파일의 절대 경로는 다음을 사용하십시오.

<script type="text/javascript" src="<%= Page.ResolveClientUrl("~/jquery.js") %>"></script> 

0
<script type="text/javascript" src="/full/path/to/jquery.js"></script>

2
루트에서 벗어난 경로의 문제는 때때로 가상 디렉터리에서 개발 한 다음 사이트의 루트에 배포하거나 그 반대로 배포 할 수 있다는 것입니다.
StuartLC

0

이 스크립트 태그가 브라우저로 직접 이동하면 사이트의 루트로 대체 할 수 없습니다. 적어도 서버에는 없습니다. 따라서 다음을 수행 할 수 있습니다.

  1. 도메인 이름의 루트에 사이트를 배포하고 절대 경로를 사용합니다 (가장 간단한 솔루션).
  2. 서버 제어와 함께이 링크를 삽입하십시오.
  3. 결과 HTML을 클라이언트로 보내기 전에 전처리하십시오 (HttpResponse.Filter 사용).

0

<base> HTML 태그를 사용할 수도 있습니다.

<base href="http://www.domain.com"></base>  

헤더 섹션의 모든 링크는 기본 주소에 상대적입니다.

<script type="text/javascript" src="scripts/jquery.js"></script>

로컬 개발 웹 서버, 데모 서버 등과 같은 여러 게시 대상이있는 경우 종종 유용합니다. 해당 기본 URL 만 바꾸면됩니다.


base href프로그래밍 방식 으로 변경하는 방법은 무엇입니까?
PreguntonCojoneroCabrón

0
<body>
<script language="javascript" src='<%= this.ResolveClientUrl("~/full/path/to/jquery.js") %>' type="text/javascript"></script>
</body>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.