2009-08-12 3 views
0

У меня есть страница aspx, содержащая регулярные html, некоторые uicomponents и несколько токенов формы {tokenname}.Заменить токены на странице aspx при загрузке

Когда страница загружается, я хочу проанализировать содержимое страницы и заменить эти маркеры на правильное содержание. Идея состоит в том, что будет несколько страниц шаблонов, использующих один и тот же код.

У меня нет никаких проблем при разборе самой строки данных (см named string formatting, replace tokens in template) моя беда заключается в том, когда читать, и как писать данные обратно на страницу ...

Какой самый лучший способ для меня переписать содержимое страницы? Я использую streamreader и заменяю страницу Response.Write, но это нехорошо - страница, содержащая другие компоненты .net, не отображается правильно.

Любые предложения были бы высоко оценены!

ответ

0

Большое спасибо тем, что вклад в этот вопрос, но я в конечном итоге использовала другое решение -

Переопределение функции визуализации как за this page, за исключением того, я разобрали содержимое страницы для нескольких различных тегов с помощью регулярных выражений.

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 - как правило, он используется для поддержки нескольких устройств, но вы можете постобработать свою страницу с этим.

1

Я не уверен, если я ответить на ваш вопрос, но ... Если вы можете изменить свое обозначение от

{tokenname} 

к чему-то вроде

<%$ ZeusExpression:tokenname %> 

вы могли бы рассмотреть вопрос о создании ваш 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"); 

конечно вы можете разработать гораздо больше на это, возможно, используя «метод полезности» для упрощения и «защиты» доступ к данным (а ccess к свойствам, никакой специальный метод, обработка ошибок и т. д.).

то, что заменяет вместо этого (например)

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

Надеется, что это помогает.

+0

Это довольно интересное решение, спасибо за ввод :) проблема: мне нужны данные с моей текущей страницы, чтобы визуализировать заменяющий текст - не уверен, могу ли я передавать объекты с моей текущей страницы в построитель выражений? Я просто нашел решение на самом деле ... возможно, я должен ответить на свой вопрос, если другие интересуются – RYFN

+0

Да, я согласен, что вы должны представить свое решение. В любом случае я отредактировал свое предложение (попробую) ответить на некоторые из ваших проблем. –