当放入用户控件或ASPX页面时,以下代码段按预期执行。
<script type="text/javascript">
(function() {
if (someCondition) {
if (<%=MyObject.IsActiveSession.ToString().ToLower() %>) {
<% If (MyObject.IsLoggedIn) Then %>
// Do some fancy stuff
<% End If %>
}
}
})();
</script>
它按照您在页面执行时的预期呈现。
有没有什么方法可以动态地在页面中注入这些代码并让它执行?
我尝试使用Literal Web Control并惊喜,它按字面输出代码:)
答案 0 :(得分:1)
没有太多友好的模板引擎可用于.NET至少社区。我去年遇到了同样的麻烦,我不得不保留客户维护的部分代码,因为他们想要格式化他们自己的文本格式。
我在没有进入任何第三方库的情况下找到的最简单的方法是使用 ASPX
渲染引擎的强大功能作为模板代码,但是以可管理的方式。
为您的模板创建ASPX
页面,例如~\Templates\LoggedInBlock.aspx
和内容:
<script type="text/javascript">
(function() {
if (someCondition) {
if (<%=MyObject.IsActiveSession.ToString().ToLower() %>) {
<% If (MyObject.IsLoggedIn) Then %>
// Do some fancy stuff
<% End If %>
}
}
})();
</script>
现在创建一个模板渲染器通用处理程序,例如~\TemplateRenderer.ashx
Imports System
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Web
Namespace TestApp1
Public Class TemplateRenderer
Implements IHttpHandler
Private Function GetContent(context As HttpContext, tempateName As String) As String
Using textWriter = New StringWriter()
context.Server.Execute(String.Format("~/Templates/{0}", tempateName), textWriter)
Return textWriter.ToString()
End Using
End Function
Public Sub ProcessRequest(context As HttpContext)
context.Response.Write(GetContent(context, context.Request.QueryString("template")))
End Sub
Public ReadOnly Property IsReusable() As Boolean
Get
Return False
End Get
End Property
End Class
End Namespace
现在,您希望将动态代码块添加到其中,因为它只是ASPX
页面的另一小部分:
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim templateName = "LoggedInBlock.aspx"
Using textWriter = New StringWriter()
Server.Execute(String.Format("~/TemplateRenderer.ashx?template={0}", templateName), textWriter)
dynamicCodeInjectPanel.InnerHtml = textWriter.ToString()
End Using
End Sub
礼貌:http://converter.telerik.com/过去常常从C#转换为VB代码。
答案 1 :(得分:0)
我不会以任何方式考虑非常干净,尽管我认为可以在编码器中使用动态编译
请参阅: http://www.codeproject.com/KB/cs/smarttemplateengine.aspx