asp.net在中继器中是否可以从另一个类调用公共函数?

asp.net在中继器中是否可以从另一个类调用公共函数?,asp.net,repeater,Asp.net,Repeater,假设我有一个中继器,它在代码背后使用了一个名为Test的公共函数 <asp:Repeater ID="Repeater1" runat="server"> <HeaderTemplate> <table> </HeaderTemplate> <ItemTemplate> <tr> <td><%# Eval("MyCol1")%></td> <td>

假设我有一个中继器,它在代码背后使用了一个名为Test的公共函数

<asp:Repeater  ID="Repeater1" runat="server">
<HeaderTemplate>
  <table>
</HeaderTemplate>

<ItemTemplate>
  <tr>
     <td><%# Eval("MyCol1")%></td>
     <td><%# Eval("MyCol2")%></td>
     <td><%# Test((int)Eval("MyCol1"))%></td>
  </tr>
</ItemTemplate>

<FooterTemplate>
  </table>
</FooterTemplate>
</asp:Repeater>
这很好,但在我的网站上,我会在不同的页面上有类似的转发器,其中大多数需要调用测试功能。是否可以将它放在公共静态类中,并直接从中继器调用它,而不是将它放在每个网页的代码后面?类似这样的东西(不起作用):

但是,如果我不必在每个网页的代码后面添加任何代码(即我更希望中继器直接调用静态函数),那就更整洁了


有什么想法或建议吗?

为页面创建一个基类,并将常用函数放在那里。因此,它将可用于所有继承的子页面。

是否使用母版页?如果你愿意,你可以把它放在那里

我会这样做:

在从母版页继承的每个内容页上,您需要:

<%@ MasterType VirtualPath="[path to your master page]" %> 
不能

<td><%# Test((int)Eval("MyCol1"))%></td>

代表

<td><%# Eval("MyCol1", "Test: {0}") %></td>


或者您的测试函数还有其他功能吗?

我通常在我的网站中为共享/静态函数创建一个类。然后可以从站点中的任何页面调用该类,并允许将代码与UI或演示代码分离

clsGlobal.cs

namespace testClass
{
    public class clsGlobal
        {
        public static int EvalNumber(int value){
            int localInt = 5;

            return localInt + value;
        }
    }
}
Default.aspx 选择1

此版本将全局类的名称空间导入到aspx页面中,这样您就可以在不使用名称空间的情况下引用静态函数。“clsGlobal.EvelMethod()”


静态类示例
Default.aspx 选择2

此版本使用包含命名空间的完全限定函数名调用静态函数。“testClass.clsGlobal.EvalNumber()”


静态类示例

公认的答案和这里的其他答案表明,继承是解决这个问题的必要条件。这让我很困惑,所以我问了自己的问题——多亏了@Walsharoo,我发现我只需要添加项目名称,就可以从中继器内部调用静态函数(在类中):


我希望这可能会对其他人有所帮助,尽管我并不是说你们都像我一样愚蠢,忘记了这个简单的把戏。

是的,我知道。你能举一个例子,我将如何从转发器调用母版页中存储的公共函数吗?确实如此。谢谢现在的问题是:将这些常用函数放在母版页还是基类中更好?如果我有多个母版页,那么使用基类是有意义的,但在我的情况下,我只有一个母版页。决策,决策…我使用多个母版页,但它们都继承了一个公共母版。大多数人似乎建议为此类功能使用基类,而不是将这些公共功能放在母版页中。另外,如果你有一个不依赖母版页的网页,那么你就被卡住了。对于基类,您仍然可以使用它。例如,请看这篇文章:从技术上讲,这两种解决方案当然都有效。我总是使用母版页,所以它对我来说很有用,但是知道这些选项很好。是的,测试函数只是一个例子。事实上还有很多,这很公平。使用OnItemDataBound事件并从那里调用方法怎么样?这可能会起作用,但其思想是代码中不包含任何代码。理想情况下,我希望aspx页面直接调用公共函数。您能给出一个示例,说明如何直接从aspx页面调用类的一个静态函数吗?谢谢。非常有用。我没有意识到这是可能的。非常感谢!这正是我想要的,不完全是。答案是,您需要添加一个名称空间,并从中继承(我确实尝试在自己的代码中实现这一点,但无法实现)。最后,我不需要新的名称空间;我只需要主要项目的名称。
Master.Test([your int value]); 
<td><%# Test((int)Eval("MyCol1"))%></td>
<td><%# Eval("MyCol1", "Test: {0}") %></td>
namespace testClass
{
    public class clsGlobal
        {
        public static int EvalNumber(int value){
            int localInt = 5;

            return localInt + value;
        }
    }
}
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="testClass._Default" %>
<%@ Import Namespace="testClass" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Static Class Example</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= clsGlobal.EvalNumber(5).ToString() %>
    </div>
    </form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="testClass._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Static Class Example</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= testClass.clsGlobal.EvalNumber(5).ToString() %>
    </div>
    </form>
</body>
</html>