2009-08-12 4 views
0

정규식 html, 일부 uicomponents 및 {tokenname} 형식의 여러 토큰을 포함하는 aspx 페이지가 있습니다.로드시 aspx 페이지의 토큰 바꾸기

페이지가로드 될 때 페이지 콘텐츠를 구문 분석하고 이러한 토큰을 올바른 콘텐츠로 바꾸기를 원합니다. 아이디어는 동일한 코드 숨김을 사용하는 여러 템플릿 페이지가있을 것이라는 점입니다.

나는 문자열 데이터 자체를 분석 아무런 문제 ... 내 문제가 읽는시에있다, 어떻게 다시 페이지에 데이터를 작성하는

을 (named string formattingreplace tokens in template 참조)도 없어 무엇이 가장 좋은 방법 페이지 내용을 다시 쓸 수 있습니까? 나는 streamreader를 사용하고 Response.Write로 페이지를 대체했지만 이것은 좋지 않습니다. 다른 .net 구성 요소를 포함하는 페이지가 올바르게 렌더링되지 않습니다.

의견을 보내 주시면 대단히 감사하겠습니다.

답변

0

많은 감사, 그러나 나는 다른 솔루션을 사용하여 끝났다.

protected override void Render(HtmlTextWriter writer) 
    { 
     if (!Page.IsPostBack) 
     { 
      using (System.IO.MemoryStream stream = new System.IO.MemoryStream()) 
      { 
       using (System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(stream)) 
       { 
        HtmlTextWriter htmlWriter = new HtmlTextWriter(streamWriter); 
        base.Render(htmlWriter); 
        htmlWriter.Flush(); 
        stream.Position = 0; 
        using (System.IO.StreamReader oReader = new System.IO.StreamReader(stream)) 
        { 
         string pageContent = oReader.ReadToEnd(); 
         pageContent = ParseTagsFromPage(pageContent); 
         writer.Write(pageContent); 
         oReader.Close(); 
        } 
       } 
      } 
     } 
     else 
     { 
      base.Render(writer); 
     } 
    } 

여기

private string ParseTagsFromPage(string pageContent) 
    { 
     string regexPattern = "{zeus:(.*?)}"; //matches {zeus:anytagname} 
     string tagName = ""; 
     string fieldName = ""; 
     string replacement = ""; 
     MatchCollection tagMatches = Regex.Matches(pageContent, regexPattern); 
     foreach (Match match in tagMatches) 
     { 
      tagName = match.ToString(); 
      fieldName = tagName.Replace("{zeus:", "").Replace("}", ""); 
      //get data based on my found field name, using some other function call 
      replacement = GetFieldValue(fieldName); 
      pageContent = pageContent.Replace(tagName, replacement); 
     } 
     return pageContent; 
    } 

당신이 원하는 방식으로 필드 이름을 사용할 수있는 위해 GetFieldValue 함수 내로, 아주 잘 작동하는 것 같다 정규식 태그 파서입니다.

1

System.Web.UI.Adapters.PageAdapter 메서드를 살펴보십시오. TransformText - 일반적으로 다중 장치 지원에 사용되지만이 기능을 사용하여 페이지를 후행 처리 할 수 ​​있습니다. 당신이

<%$ ZeusExpression:tokenname %> 
만들고 고려할 수

처럼 뭔가

{tokenname} 

에서 표기를 변경할 수있는 경우

1

나는 ... 나는 당신의 질문에 대답 해요 있는지 확실하지 않습니다 만, 귀하의 System.Web.Compilation.ExpressionBuilder. 그냥 ... 식을 만들 :

의견을 읽고 나면 ...

는 ExpressionBuilder를 사용하여 현재 페이지에 대한 액세스 권한을 얻는 다른 방법이 있습니다. 조금에게 MSDN에서 샘플을 변경하고 페이지의 코드를 가정하여 ;-) 이

public object GetData(string token); 

같은 방법을 사용하면 이것은 당신의 자리를 대체이

public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) 
{ 
    Type type1 = entry.DeclaringType; 
    PropertyDescriptor descriptor1 = TypeDescriptor.GetProperties(type1)[entry.PropertyInfo.Name]; 
    CodeExpression[] expressionArray1 = new CodeExpression[1]; 
    expressionArray1[0] = new CodePrimitiveExpression(entry.Expression.Trim()); 

    return new CodeCastExpression(
     descriptor1.PropertyType, 
     new CodeMethodInvokeExpression(
      new CodeThisReferenceExpression(), 
      "GetData", 
      expressionArray1)); 
} 

같은 것을 구현할 수 포함 (당신은 아마 간소화하고 데이터에 대한 액세스를 "보호"하기 위해 "유틸리티 방법"을 사용하여,이에 훨씬 더 정교한 수 물론이

(string)this.GetData("tokenname"); 

처럼 부르는 속성에 대한 액세스, 특별한 방법이 필요 없음, 오류 처리 등). (예를 들어)이 도움이

(string)Utilities.GetData(this, "tokenname"); 

희망 대신 대체

뭔가. 나는 정규 표현식을 사용하여 여러 다른 태그 페이지의 콘텐츠를 구문 분석을 제외하고 this page에 따라 렌더링 기능을 재정의

-이 질문에 기여하는 것과

+0

꽤 재미있는 솔루션입니다. 입력을 주셔서 감사합니다. 문제는 현재 텍스트 페이지를 렌더링하기 위해 현재 페이지의 데이터가 필요합니다. 제가 현재 페이지에서 표현 작성기로 전달할 수 있는지 확실하지 않습니까? 방금 ​​해결책을 찾았습니다 ... 다른 사람들이 궁금해 할 때를 대비하여 내 질문에 대답해야합니다. – RYFN

+0

예, 독자 분의 해결책을 제시해야합니다. 어쨌든 나는 당신의 우려 사항 중 일부에 대답하려고 시도했다. –

관련 문제