Как сделать поле глобальным для моего сайта? - PullRequest
0 голосов
/ 25 марта 2009

Хорошо, это немного абстрактно, но здесь идет речь:

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

Но теперь я добавляю элементы управления на свои страницы и хочу, чтобы они имели доступ к "foo".

Что ж, теперь foo не может быть защищен, поэтому он открыт. Хорошо. Но как контроллеры узнают о «foo»? Я могу получить доступ к foo, выполнив что-то вроде этого в моем контроле:

Foo foo = ((Bar)Page).foo;

Это работает, но мне кажется немного уродливым. Я действительно хотел бы просто иметь возможность использовать foo. Я полагаю, эй, может быть, я могу сделать тот же трюк с моими элементами управления, что я сделал для страницы. Я создаю новый класс "blargh", который наследуется от UserControl, и безобразно хватаю foo. Тогда у меня есть контроль от наследства. Ура!

За исключением того, что это не работает. Когда я запускаю проект, он жалуется на строку, пытающуюся получить доступ ((Bar) Page) .foo, потому что Page имеет значение null. Зачем? Как Пейдж может быть нулевым? Когда я смотрю на стек вызовов, мне не помогают.

Есть ли простой, понятный способ сделать это? Я лаю не на том дереве?

Ответы [ 6 ]

2 голосов
/ 25 марта 2009

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

public static class Globals
{
    public static Foo foo = new Foo();
}
2 голосов
/ 25 марта 2009

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

 Session["foo"]=data;

Тогда на других ваших страницах вы можете использовать:

 Control ctl = (Control) Session["foo"];

Имейте в виду, что вам придется приводить Session ["foo"] к тому типу, с которым вы хотите работать. Существует также аналогичное пространство Application [], которое можно использовать, если вам нужен только один экземпляр для каждого пользователя веб-сайта.

1 голос
/ 25 марта 2009

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

public static class FooClass {
   public FooClass() {
   }
   public static string FooName = "TheFoo";
}

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

FooClass myFoo = Session["CurrentFoo"] as FooClass;
1 голос
/ 25 марта 2009

Один из вариантов - расширение класса страницы с помощью методов расширения

Тогда Page будет иметь доступ к Foo всякий раз, когда существует экземпляр Page. В зависимости от того, что делает Foo, вам, вероятно, все равно придется хранить данные в сеансе.

Что касается того, почему страница недоступна в вашем контроле. Свойство Page заполняется только после добавления элемента управления на страницу. Если ваш элемент управления не находится непосредственно на странице, то когда на его странице добавляется его ответчик, он добавляется на страницу.

1 голос
/ 25 марта 2009

Является ли foo одним и тем же значением, используемым глобально, или оно варьируется для каждой страницы?

Я вижу две возможности, которые вам могут понравиться:

  1. Поместите его в объект Application ASP.Net (я точно не помню, где он висит в asp.net, но с этим именем вы можете найти на нем документ). Это будет для глобального значения, которое не меняется.

  2. Сделать это методом расширения в Control. Страница в конечном итоге наследуется от Control, поэтому она будет доступна. Как это:

    public static class ControlExtensions
    {
        public static Foo foo(this Control self)
        {
            return foo;
        }
    }
    

Теперь UserControls и Pages должны иметь к нему доступ.

1 голос
/ 25 марта 2009

К чему вам нужен доступ? Если его данные, почему бы не положить значение Foo в сеансе? Тогда к нему можно получить доступ из любого места.

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