如何将一段VB.NET代码注入ASPX页面并让它执行?

时间:2011-11-08 05:34:23

标签: asp.net

当放入用户控件或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并惊喜,它按字面输出代码:)

2 个答案:

答案 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