【问题标题】:Capturing Inline Expression Result捕获内联表达式结果
【发布时间】:2010-09-15 09:51:21
【问题描述】:

我需要做的是在 MVC 视图中捕获表达式的结果(示例如下)。

我还提供了一个存根处理器来演示我想要实现的目标。基本上我想将动作的目标转移到我以后可以操作的任意字符串缓冲区中。但是 Target 属性是只读的。可以像我在下面所做的那样使用反射来覆盖它(将目标设置为以 StringBuffer 为核心的任意写入器)。这不能正常工作,当我执行 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>";
    }
}

【问题讨论】:

    标签: c# .net model-view-controller reflection lambda


    【解决方案1】:

    问题解决了。

    我想多了这个问题,并用文本编写器替换生成的视图类,而不是替换视图 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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-09
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多