Захват результатов встроенного выражения - PullRequest
0 голосов
/ 15 сентября 2010

Что мне нужно сделать, это зафиксировать результат выражения в представлении MVC (пример ниже).

Я также предоставил заглушку Processor, демонстрирующую, чего я хочу достичь.По сути, я хочу перенаправить Target of Action в некоторый произвольный строковый буфер, которым я смогу манипулировать позже.Однако свойство Target доступно только для чтения.Можно ли это переопределить с помощью отражения, как я делаю ниже (установка цели для произвольного писателя с StringBuffer в его основе).Это не работает правильно, и я продолжаю получать исключение Null Reference, когда выполняю inline ().

Может кто-нибудь помочь?Код ниже (GetInlineResult является ключевым методом).

Вид

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Home Page
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% MvcApplication5.Processor.Absorb(() => {%>     
        reverse = (string) ->
          string.split('').reverse().join ''

        alert reverse '.eeffoC yrT'
    <%}); %>
    <%=MvcApplication5.Processor.Render()%>
</asp:Content>

Код процессора

public class Processor
{
    public static void Absorb(Action inline)
    {
        string input = GetInlineResult(inline);
        string output = Process(input);
        File.WriteAllText("SOME_PATH", output);  
    }

    private static string Process(string input)
    {
        string output = input;
        /* IRRELEVANT PROCESSING */
        return output;
    }

    private static string GetInlineResult(Action inline)
    {
        // create writers etc.
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter htmltw = new HtmlTextWriter(sw);

        // set internal value to new writer
        FieldInfo fi = inline.GetType().GetField("_target", BindingFlags.Instance | BindingFlags.NonPublic);
        fi.SetValue(inline, htmltw);

        // execute 
        inline();

        // get contents
        return sb.ToString();
    }

    public static string Render()
    {
        /* GENERATE LINK TO RENDERED FILE <script type="tpl" src="SOME_PATH"> */
        return "<script type='tpl' src='SOME_URL'></script>";
    }
}

1 Ответ

0 голосов
/ 15 сентября 2010

Проблема решена.

Я переосмыслил эту проблему и заменил сгенерированный класс представления на средство записи текста, а не заменил экземпляр TextWriter представлений.

Обновлено GetInlineResult (в настоящее время в ОЧЕНЬ сырой форме)

    private static string GetInlineResult(Action inline)
    {
        // create writers etc.
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter htmltw = new HtmlTextWriter(sw);


        object view = inline.Target;
        FieldInfo field = view.GetType().GetField("__w");
        HtmlTextWriter tw = field.GetValue(view) as HtmlTextWriter;

        field.SetValue(view, htmltw);
        // execute 
        inline();

        field.SetValue(view, tw);

        // get contents
        return sb.ToString();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...