Как вызвать метод, определенный в Default.aspx.cs, из другого класса - PullRequest
0 голосов
/ 02 сентября 2011

Я новичок в asp.net и пытаюсь создать сайт.У меня есть класс в AppCode / GSA, в котором мне нужно получить доступ к обработчику событий, объявленному в default.aspx.cs.Кто-нибудь может помочь с этим?Я попытался найти его, но все, что я получил, это стандартные вызовы методов, такие как classname.methodname () после создания экземпляра этого класса.Пожалуйста, помогите мне здесь.

Вот что я хочу сделать, и причина, по которой мне нужно вызвать метод в default.aspx.cs

Я вызываю функции GSA для создания строки htmlкоторый я использую для отображения результатов поиска в заполнителя.Работает отлично.Теперь я добавляю кнопку перед каждым отображаемым поиском.Когда пользователь нажимает эту кнопку, эта кнопка должна быть заменена текстовым полем, и она будет содержать крошечный URL для этого результата поиска.

Теперь я получаю кнопку с каждым отображаемым результатом, мне нужно назначить обработчик событий для этой кнопки.Я попытался поместить этот обработчик события в сам файл GSA.cs, но эта функция не вызывается, так как она не определена по умолчанию, поэтому я решил поместить этот обработчик в defalut.aspx.cs

Ответы [ 4 ]

2 голосов
/ 02 сентября 2011

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

private void MyEventHandler(object sender, EventArgs e)
{
    // some complex functionality
}

Должно стать:

public void DoComplexFunctionality()
{
    // some complex functionality
}

private void MyEventHandler(object sender, EventArgs e)
{
    DoComplexFunctionality();
}

Вопрос "куда мне поставить DoComplexFunctionality()?" это тот, на который может дать осмысленный ответ только тот, кто знает особенности того, что он делает. Вы можете сделать его членом статического класса, что сделает его доступным для любого кода, который может видеть этот класс. Или, если он отвечает за изменение определенного набора значений, вы можете сделать его экземпляром-членом класса, который инкапсулирует эти значения, и передать экземпляр этого класса тому, кто должен вызвать метод.

В любом случае, попытка прямого вызова обработчика события не является подходящим способом.

1 голос
/ 08 декабря 2011

Перетащите Default.aspx.cs в папку AppCode со всеми другими классами и измените путь CodeFile в вашем Default.aspx наCodeFile="~/App_Code/Default.aspx.cs" Теперь вы сможете получить к нему доступ, как и к любому другому классу.

1 голос
/ 02 сентября 2011

Вы действительно никогда не должны вызывать обработчик событий из другого кода.

У меня действительно недостаточно информации для продолжения, но я могу представить два сценария, которые могут дать вам представление о том, что вы должны сделать это: сценарий с общей страницей и сценарий с общей бизнес-логикой.

Если вы надеетесь использовать какой-то блок кода на нескольких страницах, тогда я настоятельно рекомендую вам создать родительский класс, производный от класса "Page", и поместить туда весь общий код. Это НЕ то же самое, что отношения хозяин-раб; это просто способ реализовать код, который будут использовать все ваши страницы. Например, я использую родительский класс для управления строго типизированным классом сеанса.

Если вы хотите поделиться или реализовать бизнес-логику, и бывает, что вы уже поместили ее в класс Default.aspx.cs, то вам необходимо переосмыслить свою архитектуру. Даже если вы не используете подход MVC, я настоятельно рекомендую вам подходить ко всем, кроме самых тривиальных сайтов, с трехуровневым подходом (как только вы это сделаете, дополнительная работа будет тривиальной). В этом случае вы создадите классы, которые реализуют вашу бизнес-логику и используют только код с выделенным кодом для работы с пользовательским интерфейсом. Таким образом, ваш типичный метод code-behind будет извлекать некоторые вещи из пользовательского интерфейса, создавать класс бизнес-логики и передавать его, а затем обрабатывать результаты (или наоборот). В этом случае вы сможете вызывать класс бизнес-логики, который реализует код, которым вы хотите поделиться из любого места, включая ваши классы тестирования.

0 голосов
/ 02 сентября 2011

Это то, что вы хотите?

Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string a = Class1.ctest();
        Response.Write(a);
    }
}

In App_Code / Class1.cs

using System;
using System.Collections.Generic;
using System.Web;

/// <summary>
/// Summary description for Class1
/// </summary>
public class Class1
{
    public Class1()
    {

    }
    public static string ctest()
    {
        string test = "I need this";
        return test;
    }
}

Обновлено (код, запрошенный ОП): Default.aspx.cs:

    using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;public partial class _Default : System.Web.UI.Page 
    { 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    string a = pick();
    Response.Write(a);
    }
    protected string pick() 
    { 
    string test = "I need this";
    return test;
    }
    }
...