2010-03-16 30 views
5

Tôi có trang chính ASP.net. Trong tổng thể này, tôi đã xác định tất cả các tệp css và javascript của mình. Tôi cũng có một vài hình ảnh và một vài nút và siêu liên kết.URL cơ sở trong trang chủ ASP.net với Thư mục ảo

Tất cả các url đều khai báo là tương đối tức là "/scripts/ian.js"

Tất cả mọi thứ hoạt động tốt nếu trang web này là trang web gốc, nhưng tôi cần nó để làm việc trong một thư mục ảo.

Vấn đề của tôi là khi tôi đặt trang web này trong một thư mục ảo trong một trang gốc, tất cả các liên kết của tôi đều trỏ đến trang gốc. vì vậy các liên kết của tôi trỏ tới www.root.com/scripts/ian.js nhưng nó phải trỏ đến www.root.com/virtualDir/scripts/ian.js

Tôi nghĩ rằng thẻ Base Href trong tiêu đề sẽ giúp ích, nhưng cho đến nay nó dường như không được giúp đỡ trong anyway. Tất cả các liên kết vẫn trỏ đến trang web gốc khi tôi di chuột qua chúng.

Điều tôi muốn là một cài đặt đơn lẻ trong IIS hoặc tệp cấu hình mà tôi có thể đặt url gốc và bất kỳ hình ảnh, tập lệnh hoặc liên kết nào trên trang chính hoặc trang nội dung, sẽ trỏ đến đúng vị trí.

Bất kỳ đề xuất hoặc ý tưởng nào đều được chào đón.

Cảm ơn

Trả lời

6

Tất cả các url đều khai báo là tương tức "/scripts/ian.js"

Những dường như là tuyệt đối địa chỉ web mà bạn đang sử dụng, chứ không phải là tương đối URL, mà có lẽ là lý do tại sao thẻ <base /> không có hiệu quả mong muốn:

Thuộc tính này xác định một tuyệt đối URI mà đóng vai trò như URI cơ sở cho giải quyết các URI tương đối.

- từ http://www.w3.org/TR/html401/struct/links.html#h-12.4

Bạn có thể thử gỡ bỏ các hàng đầu '/' từ URL của bạn để xem nếu mà làm việc?

Không đó, tôi có xu hướng sử dụng ResolveClientUrl để có được xung quanh các vấn đề như thế này, mà bạn muốn sử dụng trong cùng một cách như những người khác đã đề nghị sử dụng ResolveUrl:

<script type="text/javascript" src="<%= ResolveClientUrl("~/path/to/js") %>"></script> 
... 
<img src="<%= ResolveClientUrl("~/path/to/img") %>" alt="..." /> 

Hope this helps.

0

Sử dụng dấu ngã (~) trong tài liệu tham khảo yout (nghĩa là ~/Scrips/ian.js) ... xem nếu nó hoạt động Đối với liên kết thử Page.ResolveUrl trong trang .aspx.

+0

Không, dấu ngã không hoạt động đối với tập lệnh. Bạn sẽ gặp lỗi khi máy chủ cố thực thi tập lệnh. –

2

Hầu hết các thẻ, bao gồm các thẻ HTML thông thường như < liên kết >, <img>, vv có thể sử dụng ~/ như đường dẫn gốc ứng dụng nếu * 'runat = "server"' thuộc tính được thiết lập.

ví dụ:

<img src="~/images/test.png" runat="server" /> 

Điều này làm cho thẻ máy chủ và dấu ngã được thay thế bằng gốc ứng dụng trước khi đầu ra được trả về trình duyệt.

Điều này không hoạt động như mong đợi đối với tập lệnh < >. Khi 'runat = "server' được thiết lập cho thẻ script, sau đó kịch bản được coi là server-side javascript và thực hiện là cố gắng.

Để làm việc xung quanh này bạn có thể tiêm javascript sử dụng one of the register client script phương pháp. của bạn, bạn có thể sử dụng > thẻ <% = ResolveUrl ('~')% trong thẻ script của bạn.

+0

Không có cài đặt chung nào tôi có thể đặt để tôi không phải truy cập và cập nhật tất cả các liên kết, hình ảnh, tập lệnh, v.v. không? PS. Thx – SetiSeeker

+0

Không phải là tôi biết. Tôi cố gắng luôn luôn sử dụng "~" đường dẫn tương đối hoặc đường dẫn tương đối thư mục ví dụ. "../something". Điều này cho phép di chuyển ứng dụng xung quanh trong tương lai. Một regex tìm/thay thế tốt sẽ có thể bắt được nhiều nhất nếu không phải tất cả các liên kết vi phạm của bạn. – kervin

+0

Trong khi bạn có thể sử dụng "~" với runat = server để tham khảo tệp CSS, làm như vậy đối với tệp JavaScript rất có thể sẽ gây ra lỗi, vì nó sẽ buộc mã thực thi JavaScript ở phía máy chủ. –

2

phương pháp tĩnh này trả về bạn con đường http đầy đủ vào thư mục gốc của ứng dụng của bạn (trang web hoặc thư mục ảo)

public static string GetAppRootUrl(bool endSlash) 
{ 
    string host = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority); 

    string appRootUrl = HttpContext.Current.Request.ApplicationPath; 
    if (!appRootUrl.EndsWith("/")) //a virtual 
    { 
     appRootUrl += "/"; 
    } 
    if (!endSlash) 
    { 
     appRootUrl = appRootUrl.Substring(0, appRootUrl.Length - 1); 
    } 
    return host + appRootUrl; 
} 

Vì vậy, bạn có thể viết ở trang chủ:

<script src="<%= Server.HtmlEncode(GetAppRootUrl(false)) %>/scripts/ian.js" language="javascript" type="text/javascript"></script> 
0

Vì vậy, tôi thấy sự kỳ quặc của IIS đêm qua:

<script src="/js/file.js"></script> 

Sẽ không hoạt động đúng trong ứng dụng ảo trong thư mục con của trang IIS chính.

Thay vào đó, bạn PHẢI làm điều đó như thế này:

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

Đó là cách tiêu chuẩn để làm điều đó, nhưng nếu bạn không tìm kiếm nó, nó có thể làm bạn ngạc nhiên rằng từ khóa bổ sung làm cho người thân vấn đề đường dẫn biến mất.

Các vấn đề liên quan