Я могу назвать функцию, определяемую в одном частичном классе от другого частичного класса. Действительно ли это возможно?

Я создал два частичных класса для веб-страницы.

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

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

например,

<%@ Page Language="C#" MasterPageFile="~/Master Pages/LeftMenu.master" AutoEventWireup="true" CodeFile="Registration.aspx.cs" Inherits="Web_Pages_Authentication_Login_Management_Registration" Title="Registration" StylesheetTheme="Default Theme 1"  %>

Registration.aspx.cs

public partial class Web_Pages_Authentication_Login_Management_Registration : System.Web.UI.Page
{
    private string firstName;
    private string lastName;
    private string userName;
    private string userPassword;
    private string primaryEmail;
protected void btnSubmit_Click(object sender, EventArgs e)
    {
       Display();
    }
}

Registration_Database.cs

   public partial class Web_Pages_Authentication_Login_Management_Registration 
    {
       const string dbFirstName = "@FirstName";
       const string dbLastName = "@LastName";
       const string dbUserName= "@UserName";
       const string dbUserPassword = "@UserPassword";
       const string dbPrimaryEmail = "@PrimaryEmail";  

       void Display()
          {
              firstName="XYZ"; //This variable is not accessible when i put both files in different directories
          }
    }

Я получаю следующую ошибку

Error   1   'Web_Pages_Authentication_Login_Management_Registration' does not contain a definition for 'Display' and no extension method 'Display' accepting a first argument of type 'Web_Pages_Authentication_Login_Management_Registration' could be found (are you missing a using directive or an assembly reference?) C:\Documents and Settings\Administrator\Desktop\Online Test\Web Pages\Authentication\Login Management\Registration.aspx.cs  78  20  C:\...\Online Test\

Registration.aspx, Registration.aspx.cs, Registration_Database.cs являются тремя файлами, которые не находятся в папке App_Code, но принадлежит одной папке только, из которого Registration.aspx.cs, Registration_Database.cs являются частичными классами, и Registration.aspx является моим файлом дизайна. Сообщите мне, хотите ли Вы знать еще некоторую информацию о моей проблеме

Я не использую Файлы DLL. Никакой предварительно скомпилированный код

6
задан Shantanu Gupta 5 January 2010 в 12:50
поделиться

5 ответов

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

При первом обращении к странице ASP.NET компилятор будет искать только код за файлом и не будет искать во всех остальных .cs файлах возможный дополнительный код для того же самого класса. Таким образом, он никогда не увидит реализацию display(), которая, в свою очередь, приводит к тому, что код за файлом не компилируется.

Я бы, конечно, не стал использовать такой метод для того, что вы, кажется, хотите сделать, но вы можете определить пользовательский класс, который происходит от System.Web.UI.Page, и получить вашу реальную страницу, происходящую от нового класса. Определение класса должно быть в App_Code для динамически компилируемого сайта.

Registration.aspx.cs:

public partial class Web_Pages_Authentication_Login_Management_Registration : MyPage
{
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        Display();
    }
}

App_Code\MyPage.cs:

public class MyPage : System.Web.UI.Page
{
    protected void Display()
    {
        // ...
    }
}

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

Обратите внимание, что в Вашем примере размещение второго файла в каталоге App_Code не заставит его работать. Это просто приведет к тому, что два класса будут иметь одно и то же имя (при условии, конечно, что пространства имен совпадут). Это действительно не нравится :)

.
5
ответ дан 10 December 2019 в 02:48
поделиться

Да, можно вызвать метод на (частичном) классе.

Частичные классы - это только особенность некоторых языков (таких как C#) - их не существует в IL, так как они скомпилированы вместе в один класс.

Однако, иногда это может быть сложно, так как частичные объявления классов должны быть полностью идентичны, чтобы такое слияние произошло. Что включает пространство имен, так что это может быть вашей проблемой.

В качестве иллюстрации это приведет к одному классу:

namespace MyNamespace
{
    public partial class MyClass { }

    public partial class MyClass { }
}

В результате получится класс MyNamespace.MyClass. Однако, это приведет к двум разным классам:

namespace MyNamespace
{
    public partial class MyClass
    {
        public void MyMethod();
    }
}

namespace MyOtherNamespace
{
    public partial class MyClass { }
}

Это приведет к двум классам: MyNamespace.MyClass и MyOtherNamespace.MyClass. В этом случае вызов this.MyMethod из MyOtherNamespace.MyClass не будет работать.

.
1
ответ дан 10 December 2019 в 02:48
поделиться

Если я правильно понял ваш вопрос, у вас есть два файла, содержащих частичные определения класса SAME. Верно? Это не два разных класса?

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

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

.
1
ответ дан 10 December 2019 в 02:48
поделиться

Конечно, ты можешь. Как и любой другой метод в классе (частичный или нет), вы вызываете статические методы по ClassName.MethodName() или нестатические как экземпляр класса и вызываете instanceName.MethodName()

EDIT: Извините, я сначала не увидел ваших примеров.

Это должно сработать. Частичный класс разбивается на файлы, но компилируется как один класс. Таким образом, вторая часть того же самого частичного класса может без проблем получить доступ к приватным членам, определенным в другой.

.
1
ответ дан 10 December 2019 в 02:48
поделиться

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

partial class Foo
{
    partial void Bar(string someArg);
    // other code that uses Bar(s)
}
partial class Foo
{
    partial void Bar(string someArg)
    {
        Console.WriteLine(someArg);
    }
}

Обратите внимание, что методы частичного метода должны быть непубличными и не могут иметь out или неотвратимых типов возврата.

.
1
ответ дан 10 December 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: