Asp.net mvc 3 捕获部分MVC视图
我正在捕获部分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设计)方法可以不经过反射就实
<% using(Html.BeginScriptWrapper()) { %>
<script type="text/javascript">
alert("Test : <%: DateTime.Now %>");
</script>
<% } %>
反射用于用myStringWriter
替换上面的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
}
}
}