2009-01-26 40 views
7

Ý tôi là, như php'h bao gồm ...là nó có thể phát hành năng động bao gồm trong asp-classic?

cái gì đó như

 
my_file_to_be_included = "include_me.asp" 

-- > 

cho những gì tôi đã nhìn thấy cho đến nay, có một vài lựa chọn thay thế, nhưng mỗi một trong số họ có một số loại của shortcoming ...

những gì tôi đang cố gắng tìm ra là làm thế nào để tạo ra một hệ thống mẫu linh hoạt ... mà không cần phải bao gồm toàn bộ điều trong một tập tin với một tuyên bố trường hợp loooooong ...

ở đây có một vài o f liên kết

a solution using FileSysmemObject, just lets you include static pages

idem

yet another one

same thing from adobe

this approach uses Server.Execute

nhưng nó có một số thiếu sót, tôi muốn tránh ... có vẻ như (thiên đường' t đã thử) Server.Execute mã chạy trong anoth er bối cảnh, vì vậy bạn không thể sử dụng nó để tải một chức năng của bạn đang có kế hoạch để sử dụng trong đoạn code gọi ... khó chịu ...

same thing

I think this one is the same

this looks promising!!!

tôi 'không chắc chắn về nó (không thể kiểm tra nó được nêu ra) nhưng có vẻ như điều này một dinamycally xử lý các trang để một thành phần SSDI ...

bất kỳ ý tưởng ???

+0

[4guysfromrolla] (http://www.4guysfromrolla.com/) có khá tốt [bài viết] (http: // www. 4guysfromrolla.com/ASPScripts/PrintPage.asp?REF=%2Fwebtech%2F022504-1.shtml) về vấn đề này. –

+0

Bạn nên xem [ExecuteGlobal] (http://msdn.microsoft.com/en-us/library/342311f1 (VS.85) .aspx). Xem ví dụ 3 tại [Sử dụng ExecuteGlobal để bao gồm mã VBScript] (http://www.gwmicro.com/Support/Knowledge_Base/?kbnumber=GWKB2035) – loraderon

+0

Tuy nhiên, Server.Execute đã làm việc tốt cho tôi khi viết một hệ thống Templating động, bởi vì bản thân các tệp mẫu không bao giờ được dự kiến ​​sẽ thêm các hàm mới/mỗi se /. Tôi đã phải gắn một đối tượng vào một var phiên để vượt qua nó để "bao gồm" tập tin mặc dù. Vì vậy, ... câu chuyện dài ngắn, câu hỏi của bạn là hữu ích cho tôi ngay cả khi bạn không bao giờ có được những gì bạn đang tìm kiếm. :-) –

Trả lời

5

Không, bạn không thể thực hiện một giai đoạn bao gồm dyanmic.

bắn tốt nhất của bạn ở đây là một Server.Execute và đi qua bất cứ điều gì nhà nước cần thông qua một biến Session: -

Session("callParams") = BuildMyParams() 'Creates some sort of string 
Server.Execute(my_file_to_be_included) 
Session.Contents.Remove("callParams") 
+1

Bạn CÓ THỂ làm động bao gồm. Hãy xem kỹ thuật dưới đây ... – atwrok8

+0

@ atwrok8: Tôi không nghĩ rằng bạn đã hiểu chính xác sự khác biệt giữa thực thi và bao gồm. – AnthonyWJones

+1

Tôi hiểu sự khác biệt giữa Server.Execute và #include chỉ thị một cách hoàn hảo. Chỉ vì thuật ngữ "dynamic include" được sử dụng, không có nghĩa là nó có bất cứ điều gì để làm với chỉ thị #include. Đối với asp cổ điển, thuật ngữ "dynamic include" hầu như luôn được sử dụng để mô tả vấn đề sử dụng một đoạn mã động, dựa trên một số logic thời gian chạy. Các liên kết được cung cấp bởi opensas tất cả các điểm đến các giải pháp khác nhau cho vấn đề này, và tôi gần như một số openas không yêu cầu cụ thể về #include chỉ thị. – atwrok8

0

tôi là một chút gỉ trên ASP cổ điển, nhưng tôi khá chắc chắn bạn có thể sử dụng phương thức Server.Execute để đọc trong trang asp khác và sau đó thực hiện trang gọi. 15Seconds có một số basic stuff về nó - nó đưa tôi trở lại ...

+0

Liên kết chết. Đây là lý do tại sao thông tin phải được đưa vào câu trả lời thay vì liên kết với: -/ –

1

Chắc chắn bạn có thể làm REAL classic asp dynamic includes. Tôi đã viết điều này một thời gian và nó đã mở ra ASP cổ điển cho tôi theo một cách hoàn toàn mới. Nó sẽ làm chính xác những gì bạn đang có, mặc dù mọi người dường như nghĩ rằng nó là không thể!

Mọi sự cố chỉ cho tôi biết.

+1

@atwork: Điều này không bao gồm và cho bản ghi chỉ lặp lại những gì tôi đã nêu trong câu trả lời gần nhất bạn có thể nhận được nó là một Server.Execute. Có một sự khác biệt quan trọng giữa một Thi hành và một Bao gồm. Một thực thi sử dụng một bối cảnh kịch bản lệnh mới, tất cả các mã và các biến được kèm theo trong ngữ cảnh đó cho trang được thi hành. Một bao gồm chèn mã vào kịch bản hiện tại (trước khi bất kỳ mã nào chạy một điều tĩnh của nó) và sau đó toàn bộ mã thực thi trong cùng một ngữ cảnh, chia sẻ các biến và các hàm. – AnthonyWJones

+0

Tôi sẽ xem xét nó ... – opensas

+0

@ atwrok8 - Bất kỳ cơ hội nào bạn có thể đưa mã đó qua liên kết khác hoặc cập nhật câu trả lời của bạn để bao gồm nó? Liên kết chết –

0

Tôi đang xây dựng trang web nơi thuận tiện để có thể sử dụng tính năng động bao gồm. Trang web là tất cả ajax (không tải lại trang) và trong khi các cuộc gọi trả lại dữ liệu thuần túy không cần đến nó, tất cả nội dung html khác nhau cho từng phần ứng dụng khác nhau (window/pane/area/form v.v.) có vẻ tốt nhất với tôi trong các tệp khác nhau.

Ý tưởng ban đầu của tôi là có cuộc gọi ajax quay trở lại tệp chính "trung tâm trung tâm" (khởi động ứng dụng ở vị trí đầu tiên), sau đó sẽ biết tệp phụ sẽ bao gồm. Đơn giản chỉ cần bao gồm tất cả các tập tin là không khả thi sau khi tôi nhận ra rằng mỗi cuộc gọi cho một số mảnh nhỏ có thể sẽ phải phân tích tất cả các mã ASP cho toàn bộ trang web! Và việc sử dụng phương thức Execute không tốt, cả về mặt tốc độ và bảo trì.

Tôi giải quyết được vấn đề bằng cách đặt các trang "con" là các trang chính và bao gồm tệp "trung tâm trung tâm" trong mỗi trang. Về cơ bản, đó là một chuyến đi khứ hồi javascript bao gồm.

Điều này ít tốn kém hơn vì có vẻ như toàn bộ ý tưởng của một trang web là máy chủ đáp ứng các yêu cầu của khách hàng cho "trang tiếp theo" mọi lúc. Nội dung đang được yêu cầu được xác định trong phạm vi của trang đang được gọi.

Hạn chế duy nhất cho điều này là "phần web" của ứng dụng phải tách rời một phần: hầu hết nội dung của chúng trong tệp .asp thực, nhưng đủ cấu trúc và mối quan hệ được xác định trong chính. asp file (ví dụ, một mục menu trong một mảnh web biết tên để sử dụng để gọi hoặc tải một đoạn web khác và cách tải đó nên được thực hiện). Tuy nhiên, theo cách này, đây vẫn là một lợi thế so với một trang web truyền thống nơi mỗi trang phải biết cách tải mọi trang khác. Bây giờ, tôi có thể thực hiện các công việc như "tải phần này (cho dù đó là toàn bộ trang hoặc cách khác) theo cách nó muốn tải".

Tôi cũng thiết lập nó để mỗi phần có thể có javascript và css riêng của mình (nếu chỉ một phần đó cần những thứ đó). Sau đó, các tệp đó được bao gồm động thông qua javascript chỉ lần đầu tiên một phần được tải. Sau đó, nếu phần được nạp nhiều lần, nó sẽ không phải trả thêm phí.

2

Phiên bản cải tiến (v2.0):

<% 
' **** Dynamic ASP include v.2.0 

function fixInclude(content) 
    out="" 
    if instr(content,"#include ")>0 then 
     response.write "Error: include directive not permitted!" 
     response.end 
    end if  
    content=replace(content,"<"&"%=","<"&"%response.write ") 
    pos1=instr(content,"<%") 
    pos2=instr(content,"%"& ">") 
    if pos1>0 then 
     before= mid(content,1,pos1-1) 
     before=replace(before,"""","""""") 
     before=replace(before,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""") 
     before=vbcrlf & "response.write """ & before & """" &vbcrlf 
     middle= mid(content,pos1+2,(pos2-pos1-2)) 
     after=mid(content,pos2+2,len(content)) 
     out=before & middle & fixInclude(after) 
    else 
     content=replace(content,"""","""""") 
     content=replace(content,vbcrlf,""""&vbcrlf&"response.write vbcrlf&""") 
     out=vbcrlf & "response.write """ & content &"""" 
    end if 
    fixInclude=out 
end function 

Function getMappedFileAsString(byVal strFilename) 
    Dim fso,td 
    Set fso = Server.CreateObject("Scripting.FilesystemObject") 
    Set ts = fso.OpenTextFile(Server.MapPath(strFilename), 1) 
    getMappedFileAsString = ts.ReadAll 
    ts.close 
    Set ts = nothing 
    Set fso = Nothing 
End Function 

execute (fixInclude(getMappedFileAsString("included.asp"))) 
%> 
+3

nếu bạn đã cải thiện câu trả lời cuối cùng của mình, tôi khuyên bạn chỉ nên chỉnh sửa câu trả lời trước đó, không cần đặt một câu trả lời mới –

0

Cũng giống như một lưu ý bổ sung. Tôi đã nhận được các ký tự ASCII lạ ở đầu các trang đang sử dụng động bao gồm vì vậy tôi thấy rằng bằng cách sử dụng một đối tượng ADODB.Stream để đọc các tập tin bao gồm loại bỏ vấn đề này.

Vì vậy, mã của tôi cập nhật cho các chức năng getMappedFileAsString như sau

Function getMappedFileAsString(byVal strFilename) 
    Dim fso 
    Set fso = CreateObject("ADODB.Stream") 

    fso.CharSet = "utf-8" 
    fso.Open 
    fso.LoadFromFile(Server.MapPath(strFilename)) 

    getMappedFileAsString = fso.ReadText() 

    'Response.write(getMappedFileAsString) 
    'Response.End 

    Set fso = Nothing 
End Function 
Các vấn đề liên quan