2009-03-25 5 views
0

Хорошо, это немного абстрактно, но здесь идет:Как сделать поле глобальным для моего сайта?

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

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

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

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

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

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

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

+0

Кто-то голосовал за этот вопрос? Мне было бы интересно узнать, почему, поэтому я мог бы исправить это, если это возможно. – Beska

ответ

2

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

public static class Globals 
{ 
    public static Foo foo = new Foo(); 
} 
+0

Я тоже начал этот маршрут. Я слышал, что это предпочтительный метод. Я нашел хорошее резюме здесь: http://dotnetperls.com/Content/Global-Variables-ASPNET.aspx –

+0

Этот ответ касается самого ясного ответа на мой неясный вопрос, на который я мог бы надеяться, так что вы получите победу. – Beska

2

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

Session["foo"]=data; 

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

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

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

1

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

1

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

Я вижу две возможности, вы могли бы:

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

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

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

Теперь элементы управления UserControl и страницы должны быть в состоянии добраться до него.

1

Один из вариантов, чтобы посмотреть на это, чтобы расширить класс страницы с помощью extension methods

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

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

1

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

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

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

FooClass myFoo = Session["CurrentFoo"] as FooClass; 
Смежные вопросы