Asp.net mvc 3 捕获部分MVC视图

Asp.net mvc 3 捕获部分MVC视图,asp.net-mvc-3,view,response,Asp.net Mvc 3,View,Response,我正在捕获部分MVC视图,如下所示: <% using(Html.BeginScriptWrapper()) { %> <script type="text/javascript"> alert("Test : <%: DateTime.Now %>"); </script> <% } %> 反射用于用myStringWriter替换上面的InnerWriter 有没有合适的(ASP.NET MVC设计)方法可以不经过反射就实

我正在捕获部分MVC视图,如下所示:

<% using(Html.BeginScriptWrapper()) { %>
<script type="text/javascript">
    alert("Test : <%: DateTime.Now %>");
</script>
<% } %>
反射用于用my
StringWriter
替换上面的
InnerWriter

有没有合适的(ASP.NET MVC设计)方法可以不经过反射就实现这一点?
那就是重定向到“代码>响应”的内容。在视图的中间输出“输出/代码”。

这个扩展方法实际上在做什么?名称
BeginScriptWrapper
表明您希望围绕某些内容生成
标记(非常类似于
Beginnform()
在内容周围添加
和关闭
标记。但是你还是把这些标记放在里面,这样就没有意义了。@StephenMuecke你是对的,添加
标记可以(是)合并到此扩展中。其目的是存储脚本片段并在页面末尾输出它们。然后假设扩展方法确实生成了
标记(并且您删除了在
Html.BeginScriptWrapper()中手动添加它们的操作)-为什么不在页面底部使用方法,以便在页面底部输出结果?@StephenMuecke我知道,代码可以工作。但是,我唯一能够实现这一点的是通过反射访问(获取/设置)
SwitchWriter
类的内部
InnerWriter
属性(类型为
ViewContext.HttpContext.Response.Output
)。可能我忽略了另一种捕获/重定向部分视图输出的已知方法。@StephenMuecke,等等,我想我误解了你的问题。在许多嵌套的部分视图中有多个javascript片段。这些片段将在视图处理过程中收集,并在页面末尾输出。你到底想做什么使用此扩展方法?名称
BeginScriptWrapper
表明您希望围绕某些内容生成
标记(很像
Beginnform()
在内容周围添加
和关闭
标记。但是你还是把这些标记放在里面,这样就没有意义了。@StephenMuecke你是对的,添加
标记可以(是)合并到此扩展中。其目的是存储脚本片段并在页面末尾输出它们。然后假设扩展方法确实生成了
标记(并且您删除了在
Html.BeginScriptWrapper()中手动添加它们的操作)-为什么不在页面底部使用方法,以便在页面底部输出结果?@StephenMuecke我知道,代码可以工作。但是,我唯一能够实现这一点的是通过反射访问(获取/设置)
SwitchWriter
类的内部
InnerWriter
属性(类型为
ViewContext.HttpContext.Response.Output
)。可能我忽略了另一种捕获/重定向部分视图输出的已知方法。@StephenMuecke,等等,我想我误解了你的问题。在许多嵌套的部分视图中有多个javascript片段。这些片段将在视图处理过程中收集,并在页面末尾输出。
public static class HelperScriptWrapper
{
  public static IDisposable BeginScriptWrapper(this HtmlHelper anHtml)
  {
    return new ScriptWrapper(anHtml);
  }

  class ScriptWrapper : IDisposable
  {
    private HtmlHelper fHtml;
    private TextWriter fOldWriter;
    private StringWriter fNewWriter;

    private TextWriter ReplaceInnerWriter(TextWriter aReplacement)
    {
      TextWriter writer = fHtml.ViewContext.HttpContext.Response.Output;
      PropertyInfo propInfo = writer.GetType().GetProperty("InnerWriter",
        System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

      TextWriter oldWriter = propInfo.GetValue(writer, null) as TextWriter;
      propInfo.SetValue(writer, aReplacement, null);

      return oldWriter;
    }

    public ScriptWrapper(HtmlHelper anHtml)
    {
      fHtml = anHtml;
      fNewWriter = new StringWriter();
      fOldWriter = ReplaceInnerWriter(fNewWriter);
    }

    public void Dispose()
    {
      ReplaceInnerWriter(fOldWriter);
      string result = fNewWriter.GetStringBuilder().ToString();
      // store result to use later
    }
  }
}