使用共享类中的函数作为内联表达式

问题描述 投票:0回答:1

我正在尝试使用一个位于共享类中的函数,并在网页上使用内联表达式。如果该函数位于代码隐藏页面中,我可以让它以多种方式工作。但是,这个函数位于另一个类中,我无法让它直接使用它。请参阅下面我的示例和尝试。

这是共享类中的函数。

Public Class Class1
    Public Function MyClassFunction() As String
        Return "Return results from MyClassFunction."
    End Function
End Class

我想在我的网页上使用该函数作为内联表达式。 我知道下面显示的内容不起作用(我没有声明该类的新实例)并且我只是提供我想要做的事情的示例

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="default.aspx.vb" Inherits="_default" %>
<!doctype html>
<html lang="en">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <p>I want to use the function from the class as an inline expression:</p>
        <asp:Label ID="Label1" runat="server" Text="<%$ Class1.MyClassFunction() %>" />
    </form>
</body>
</html>

我尝试在代码隐藏页面中声明类的新实例,然后尝试使用各种类型的内联表达式,但没有任何效果(例如嵌入代码块<% %>、显示<%= %>和数据绑定内联表达式<%# %> ).

声明共享类:

Public Class _default
    Inherits System.Web.UI.Page
    Dim MySharedClass1 As New Class1
End Class

使用内联表达式的示例:

<asp:Label ID="Label1" runat="server" Text="<%= MySharedClass1.MyClassFunction() %>" />
<asp:FormView blah blah blah ... has binding datasource ... blah blah blah>
    <asp:Label ID="Label1" runat="server" Text="<%# MySharedClass1.MyClassFunction() %>" />
</asp:FormView>

我还尝试使用基于我发现的旧示例的表达式生成器(下面的链接)。同样,如果该函数位于代码隐藏页面中,则此方法有效,但如果该函数位于共享类中,则此方法无效。

表达式生成器的类:

Imports System.CodeDom
Imports System.Web.Compilation
<ExpressionPrefix("Code")> _
Public Class CodeExpressionBuilder
    Inherits ExpressionBuilder
    Public Overrides Function GetCodeExpression(entry As BoundPropertyEntry, parsedData As Object, context As ExpressionBuilderContext) As CodeExpression
        Return New CodeSnippetExpression(entry.Expression)
    End Function
End Class

表达式生成器的Web.config 文件参考:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.5">
      <expressionBuilders>
        <add expressionPrefix="Code" type="CodeExpressionBuilder" />
      </expressionBuilders>
    </compilation>
  </system.web>
</configuration>

声明共享类(同上):

Public Class _default
    Inherits System.Web.UI.Page
    Dim MySharedClass1 As New Class1
End Class

将其用作表达式生成器内联表达式 (<%$...%>):

<asp:Label ID="Label1" runat="server" Text="<%$ MySharedClass1.MyClassFunction() %>" />

博客文章示例链接:

表达式生成器博客链接

asp.net vb.net function class
1个回答
0
投票

当然,您必须先创建该类的实例,然后才能使用它,因此往往无法选择使用内联表达式。

但是,您当然可以为给定页面创建该类的实例。

另外,请记住,在标记中,您不能对服务器端控件使用服务器端表达式(因为它们已经是服务器端控件)。

因此,在页面中,我将此代码放在顶部以公开该类的公共实例:

Public MyClass1 As New MyCalendar3.Class1

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


End Sub

好的,现在在标记中,这是合法的:

<form id="form1" runat="server">

    <div>

        <h3><%=MyClass1.MyClassFunction %></h3>

    </div>
</form>

但这不合法:

        <asp:Label ID="Label1" runat="server" 
            Text='<%=MyClass1.MyClassFunction %>' >
        </asp:Label>

因此,如上所示,您仍然需要先创建该类的实例,然后才能使用它。

但是,您可以在类中添加/使用称为“静态”的函数/方法。因此,无需创建类的实例即可使用这些类成员。

事实上,与C#不同的是,在VB.NET中我们可以继续使用代码模块。代码模块实际上与具有静态方法的类非常相似。 因此,放置在该类中的任何静态(共享)代码都将成为全局函数。

所以,任何一个选择都可以。请记住,对于此类静态方法,永远不要将变量范围限定到类,因为在网络领域,由于拥有一台计算机,因此所有(其他)用户将看到相同的值。所以,静态方法是肯定的,但是(永远)不能使用该类中公开的公共变量。

我建议对于这样的共享代码,我通常不会打扰类,而只需使用一个好的老式代码模块,并将这样的代码放在该模块中。

但是,让我们将类函数更改为静态(共享),如下所示:

Public Class Class1

    Public Shared Function MyClassFunction() As String


        Return "Return results from MyClassFunction"

    End Function

End Class

现在,我们不必创建该类的实例即可使用该共享代码。

因此,我们现在可以从后面的代码中删除该类的公共实例,然后直接在标记(服务器端)表达式中使用基类实例。

因此,现在背后的代码是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load


End Sub

现在的标记是这样的:

        <h3><%=Class1.MyClassFunction %></h3>

因此,我们直接使用基类,在使用之前不需要创建该类的实例。正如我所指出的,您也可以代替类 + 静态(共享)方法,您可以创建一个好的老式代码模块,就像我们在旧的 VB4、5、6 甚至 VBA 时代所做的那样。

因此,请记住,服务器端表达式不能用于已标记为“runat=Server”的控件,因为此类代码无论如何都可以放置在页面加载事件中,而现在我们没有 2或者 3 种不同的方式来处理设置控制值,从而给开发和调试带来了巨大的挑战(因为我们现在在处理服务器端控件时没有 2 个不同的地方来查找代码。所以,仅供参考,服务器端控件不允许服务器端表达式“%=”。但是,数据绑定是一件非常不同的事情,服务器端控件确实允许数据绑定表达式(例如在 GridView 中使用)。

那么,假设您想将该标签设置为类结果?

因此这个标记:

        <asp:Label ID="Label1" runat="server" Text="">
        </asp:Label>

然后我们将被迫使用后面的代码,并且如上所述,我们不能对上面的文本属性使用服务器端表达式(但话又说回来,我们不必这样做???)。

然后使用我们的静态(共享)代码,页面加载就变成这样:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Label1.Text = Class1.MyClassFunction

End Sub

因此,再次注意不需要类函数的实例。

© www.soinside.com 2019 - 2024. All rights reserved.