2009-11-23 59 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

相關問題