【发布时间】: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