2009-11-12 4 views
1

예를 들어 웹 양식이있는 경우 ~/Page1.aspx는 코드 숨김 파일에 정의 된 Page1 클래스를 구현하며, 프로그래밍 방식으로 URL을 판별 할 수있는 방법이 있습니다 (~/Page1.asp).클래스를 기반으로 웹 양식의 URL을 프로그래밍 방식으로 찾을 수 있습니까?

string url = GetUrlOfWebForm(new Page1()); 

그래서 페이지로 링크 코드가 업데이트 될 클래스의 인스턴스에서 아마

string url = GetUrlOfWebForm(typeof(Page1)); 

또는 같은 페이지가/이름이 바뀐 이동하는 경우, 또는 내가 컴파일 시간 오류 페이지가 제거되면.

+0

페이지 클래스의 네임 스페이스 + 이름을 구문 분석하여 유용한 것을 얻을 수 있습니다. –

답변

-1

거의 사용되지는 않지만 여러 개의 ASPX를 단일 클래스에서 상속받을 수 있습니다.

이 부작용은 마크 업에서 Page 태그의 inherits 속성 이외에 클래스와 마크 업간에 연결이 없으므로 클래스의 URL을 찾을 수 없다는 것입니다.

[MyUrlAttribute("/somefolder/MyPage.aspx")] 
class MyPage : Page 
{ 
} 

다음 반사를 통해 것을에 액세스하거나 페이지 자체에 정적 속성을 설정 : 당신은 같은 페이지 클래스에 사용자 정의 속성을 추가하여 뭔가를 해결할 수 있습니다. r 응용 프로그램 시작시 aspx를 검사하고, @ page 태그를 구문 분석하여 inherits = "..."값을 가져 와서 나중에 사용할 수 있도록 표에 저장하십시오. 이 문제에 대한 잠재적 인 해결책이 많이 있지만 "Page.AspxPath"와 같은 속성은 없습니다.

다른 사람들이 제안했듯이 정상적인 요청을 처리하는 중이라면 항상 Request.Url을 사용할 수 있습니다. 그러나 a) 유효한 Request 컨텍스트가 없거나 b) 클래스를 기반으로 요청한 것 이외의 aspx를 렌더링하려는 경우 페이지를 렌더링하려는 경우 다음을 수행해야합니다. 어떤 마술.

+0

아 - 요점을 봅니다. 그러나 이동하는 사람이 속성을 업데이트하지 않으면 페이지가 이동하는 경우 링크가 업데이트된다는 사실을 실제로 확인할 수 없습니다. 그 여분의 컴파일 시간 검사를 잊어 버리면됩니다. – Pete

4

Request.Url을보고 사이트 구조의 위치를 ​​확인하면 브라우저에서 요청한 URL이 표시됩니다.

다른 방법은 사이트의 페이지에있는 모든 링크가 프로그램에 의해 링크를 변경하지 않아도되는 상대 링크인지 확인하는 것입니다.

+0

Request.url은 요청되는 페이지의 URL을 알려주지 만 리디렉션하려는 페이지의 URL을 원했습니다. – Pete

+0

그 진술은 귀하의 질문과 완전히 반대됩니다. 귀하의 질문을 수정하십시오. – Lazarus

0

즉, 페이지 URL을 알기 전에 또는 열지 않고 페이지 URL을 알고 싶다는 뜻입니다. 생각한 것처럼 자동으로 가능하지는 않습니다.

당신은 그것의 페이지를 예를 들어 열 곳 페이지 클래스는 어떻게 알 수 있기 때문에, URL 문자열에게 자기를 구성해야합니다

http://localhost/Page1.aspx

http://website/Page1.aspx

은 또한 당신은 페이지를 이동할 수 있습니다 그 클래스와 다른 폴더.

클래스 내에 상수 변수를 넣거나 페이지 URL을 직접 구성하거나 페이지가로드 될 때까지 대기 한 다음 다른 방법으로 가져올 수 있습니다 : Request.Url

1

모든 페이지가 동일한 네임 스페이스에 있고 네임 스페이스가 폴더 구조를 제대로 반영하면 네임 스페이스 문자열을 조작하여 해당 페이지의 상대 URL을 결정할 수 있습니다. 패턴을 따르지 않는 페이지가있는 경우 사례별로 처리 할 수 ​​있습니다.이 작업을 수행하는 한 가지 방법은 각 페이지를 RelativeUrl 속성을 포함하는 기본 클래스에서 상속 받아 개별 페이지에 대해 재정의 할 수있게하는 것입니다.

private const string PAGES_PREFIX = "Web.Pages"; 
public string ResolveUrl<T>() where T : Page 
{ 
    string pagePath = typeof(T).FullName; 
    if (pagePath.StartsWith(PAGES_PREFIX)) 
    { 
     return string.Format("~/Pages/{0}.aspx", pagePath.Substring(PAGES_PREFIX.Length).Replace('.', '/')); 
    } 
    Debug.Fail(string.Format("Unable to resolve url for {0}", pagePath)); 
    return null; 
} 

이 솔루션은 사용자의 네임 스페이스와 일치하도록 수정해야하지만 잘하면 얻을 수 있습니다.

관련 문제