2009-11-23 26 views
3

说我有这个中继器,它使用了一个名为测试代码隐藏的公共功能。asp.net在中继器中是否可以调用另一个类的公共函数?

<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(); 
} 

这工作得很好,但在我的网站,我会在不同的页面类似中继器,其中大部分将需要调用的测试功能。而不是在每个网页的代码隐藏中,它可能会放在一个公共静态类,直接从中继器调用它?这样的事情(不工作):

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

我想出的唯一的解决办法是隐藏的代码转换功能在到:

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

但它会整洁如果我不必在每个网页的代码隐藏(即我希望中继器直接调用静态函数)的任何代码。

任何想法或建议吗?

回答

2

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

0

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

我会做这样的事情:

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

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

这可以让你去主服务器上的公共方法。

在您的内容页面,只要你需要调用的测试方法:

Master.Test([your int value]); 
+0

是的,我愿意。你能举一个例子,我将如何从中继器调用存储在母版页中的公共函数? – Anthony 2009-11-23 09:58:23

+0

更新了答案,让我知道你是如何得到的。 – adrianos 2009-11-23 10:15:17

+0

确实有效。谢谢!现在的问题是:将这些常用函数放在主页面还是基类中更好?如果我有多个母版页,那么使用基类是有意义的,但在我的情况下,我只有一个母版页。决定,决定... – Anthony 2009-11-23 10:15:40

2

不能

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

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

或者代表有更多的你的测试功能呢?

+0

是的测试功能只是一个例子。现实中还有更多。 – Anthony 2009-11-23 20:39:00

+0

够公平的。那么使用OnItemDataBound事件并从那里调用该方法呢? – 2009-11-23 20:46:13

+0

这可能会起作用,但这个想法并不是在代码隐藏方面有任何代码。理想情况下,我希望aspx页面直接调用通用函数。 – Anthony 2009-11-25 11:08:42

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> 
+0

你可以举一个例子,你如何直接从aspx页面调用你的类的静态函数? – Anthony 2009-11-23 20:47:18

+0

更新了上面的代码示例以显示示例。 – Tinidian 2009-11-24 11:30:11

+0

谢谢。很有用。我没有意识到有可能这样做。 – Anthony 2009-11-24 17:08:02

0

这里接受的答案和其他答案表明继承是解决这个问题的必要条件,这让我困惑,所以我问自己的问题 - How to call functions in a Class file, when inside a Repeater, without inheritance - 感谢@Walsharoo我从一个中继器里发现我只需要添加的项目名称,我可以调用一个静态功能(在Class):

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

这可能成为帮助他人,我希望,尽管我并不是暗示你忘记了这个简单的伎俩,就像我一样愚蠢。

+0

与这个不一样的答案:https://stackoverflow.com/a/1783062/15928 – Anthony 2017-07-04 14:14:00

+0

不完全是。这个答案说你需要添加一个命名空间,并从它继承(我试图让我的代码工作,但不能)。最后我不需要新的命名空间;我只需要主要的项目名称。 – 2017-07-05 12:30:48

相关问题