asp.net В репитере можно ли вызвать публичную функцию из другого класса?

Скажем, у меня есть этот повторитель, который использует общедоступную функцию 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);
}

Но было бы лучше, если бы мне не приходилось вставлять какой-либо код в код программной части каждой веб-страницы (т.е. я бы предпочел, чтобы ретранслятор напрямую вызывал статическую функцию).

Есть идеи или предложения?


person Anthony    schedule 23.11.2009    source источник


Ответы (5)


Создайте базовый класс для своих страниц и поместите туда свою общую функцию. Таким образом, он будет доступен для всех унаследованных дочерних страниц.

person Saar    schedule 23.11.2009

Не могу

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

Быть представлен

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

Или в вашей тестовой функции есть что-то еще?

person Mark Holland    schedule 23.11.2009
comment
Да, функция Test была просто примером. На самом деле это еще не все. - person Anthony; 23.11.2009
comment
Справедливо. Как насчет использования события OnItemDataBound и вызова метода оттуда? - person Mark Holland; 23.11.2009
comment
Это, вероятно, сработает, но идея состоит в том, чтобы не включать код программной части. В идеале я бы хотел, чтобы страница aspx напрямую вызывала общую функцию. - person Anthony; 25.11.2009

Обычно я создаю класс для общих / статических функций на своих веб-сайтах. Затем этот класс можно вызвать с любой страницы сайта и позволяет отделить код от вашего пользовательского интерфейса или кода презентации.

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>
person Tinidian    schedule 23.11.2009
comment
Можете ли вы привести пример того, как вы вызываете одну статическую функцию вашего класса прямо со страницы aspx? - person Anthony; 23.11.2009
comment
Спасибо. Очень полезно. Я не понимал, что это возможно. - person Anthony; 24.11.2009
comment
Большое спасибо! Это именно то, что я искал. - person ClearCloud8; 13.12.2012

Вы используете главную страницу? Вы можете бросить его туда, если сделаете это.

Я бы сделал что-то вроде этого:

На каждой странице содержимого, наследуемой от главной страницы, вам необходимо:

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

Это позволяет вам получить доступ к общедоступным методам на мастере.

На странице содержимого всякий раз, когда вам нужно вызвать метод Test:

Master.Test([your int value]); 
person adrianos    schedule 23.11.2009
comment
Да. Можете ли вы привести пример того, как я бы вызвал из репитера публичную функцию, хранящуюся на главной странице? - person Anthony; 23.11.2009
comment
Действительно, это работает. Спасибо! Теперь возникает вопрос: что лучше: поместить эти общие функции на главную страницу или в базовый класс? Если бы у меня было несколько мастер-страниц, было бы разумно использовать базовый класс, но в моем случае у меня только одна мастер-страница. Решения, решения ... - person Anthony; 23.11.2009
comment
Я использую несколько мастер-страниц, но все они наследуют общий мастер. - person adrianos; 23.11.2009
comment
Большинство людей, кажется, предлагают использовать базовый класс для такого рода функций вместо того, чтобы помещать эти общие функции на главную страницу. Также, если у вас есть веб-страница, которая не зависит от главной страницы, вы застряли. С базовым классом вы все равно можете его использовать. см. это сообщение, например: stackoverflow.com/questions/738777/ и эту статью: dotnetslackers.com/articles/aspnet/ Технически говоря, оба решения, конечно, работают. - person Anthony; 23.11.2009
comment
Интересный. Я всегда использую главные страницы, поэтому мне это подходит, но хорошо знать варианты. - person adrianos; 23.11.2009

Принятый ответ и другие ответы здесь предполагают, что для решения этой проблемы необходимо наследование. Это меня смутило, поэтому я задал свой вопрос - Как вызывать функции в файле класса, когда внутри Repeater, без наследования - и благодаря @Walsharoo я обнаружил, что мне просто нужно добавить проект Name, и я мог бы вызвать статическую функцию (в классе) из ретранслятора:

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

Надеюсь, это может оказаться полезным для других, хотя я не предполагаю, что вы все такие глупые, как я, из-за того, что забыли этот простой трюк.

person Magnus Smith    schedule 04.07.2017
comment
Не совсем. В этом ответе говорилось, что вам нужно ДОБАВИТЬ пространство имен и унаследовать от него (я пытался заставить это работать в моем собственном коде, но не смог). В конце концов, мне не понадобились новые пространства имен; Мне просто нужно было название основного проекта. - person Magnus Smith; 05.07.2017