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

时间:2009-11-23 09:44:57

标签: asp.net repeater

假设我有这个转发器,它在代码隐藏中使用了名为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>

在我的代码隐藏中,我有这个功能

public string Test (int Value)
{
   return "Test"+Value.ToString();
}

这很好但在我的网站上我会在各种页面上有类似的中继器,大多数都需要调用Test功能。不是将它放在每个网页的代码隐藏中,而是可以将它放在公共静态类中并直接从转发器中调用它?像这样的东西(不起作用):

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

我提出的唯一解决方案是将代码隐藏中的函数更改为:

public string Test (int Value)
{
   return MyStaticClass.Test(Value);
}

但如果我不必在每个网页的代码隐藏中放置任何代码(即我希望转发器直接调用静态函数),那就更整洁了。

有任何想法或建议吗?

5 个答案:

答案 0 :(得分:2)

为您的网页创建一个基类,并将您的常用功能放在那里。因此它将适用于所有继承的子页面。

答案 1 :(得分:2)

不能

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

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

或者你的测试功能还有更多吗?

答案 2 :(得分:2)

我通常在我的网站中为共享/静态函数创建一个类。然后可以从站点中的任何页面调用此类,并允许从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()”

<%@ 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>

的Default.aspx 备选方案2

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

<%@ 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>

答案 3 :(得分:0)

您使用母版页吗?如果你这样做,你可以放在那里。

我会做这样的事情:

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

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

这允许您访问主服务器上的公共方法。

在您的内容页面上,无论何时需要调用Test方法:

Master.Test([your int value]); 

答案 4 :(得分:0)

接受的答案以及此处的其他答案表明,继承是解决此问题的必要条件。这让我很困惑,所以我问自己的问题 - How to call functions in a Class file, when inside a Repeater, without inheritance - 并且感谢 @Walsharoo 我发现我只需要添加项目名称,我可以调用 static < / strong>来自转发器内部的功能(在一个类中):

<td><%# [ProjectName].ClassName.MyStaticFunction(Eval("MyColumnName"))%></td>

这可能对其他人有帮助,我希望,虽然我并没有暗示你因为忘记这个简单的伎俩而像我一样愚蠢。