На странице Default.aspx нужно создать переменную, например userName. Контролу, который подключен к этой старнице нужно получить эту переменную. Переменная должна жить только в течение генерирования страницы. Пробовал использовать static, но в таком виде она сохраняется при переходе на другую страницу.
Вроде простейшая задача, но никак не получается ее решить.
.NET 2.0 Beta 2
Re: Доступ к переменным их контрола
От:
Аноним
Дата:
17.06.05 09:25
Оценка:
Hranite peremnnuu kak svoistvo kontrola (vnutri kontrola pomeshat' vo ViewState ili sessiu)
Здравствуйте, Аноним, Вы писали:
А>Hranite peremnnuu kak svoistvo kontrola (vnutri kontrola pomeshat' vo ViewState ili sessiu)
А нельзя как раньше в обычном ASP? Один раз переменную вверху страницы создал, а потом везде используешь? И еще, я так понимаю, Viewstate служит для передачи переменных _между страницами_?
Здравствуйте, flashion, Вы писали:
F>Попробуйте ее получить юзер-контролом.
А... Тогда точно не понял задачу. А наоборот, встроить переменную в пользовательский контрол и задавать его значение из страницы?
Здравствуйте, Морской дьявол, Вы писали:
МД>Здравствуйте, flashion, Вы писали:
F>>Попробуйте ее получить юзер-контролом. МД>А... Тогда точно не понял задачу. А наоборот, встроить переменную в пользовательский контрол и задавать его значение из страницы?
Да! Но только не так, чтобы сделать, скажем, 10 контролов, которые будут использовать одно и то же свойство и на странице задавать это свойство для каждого контрола по отдельности, а создать свойство класса страницы, а из нужных контролов запрашивать это свойство.
Здравствуйте, flashion, Вы писали:
F>На странице Default.aspx нужно создать переменную, например userName. Контролу, который подключен к этой старнице нужно получить эту переменную. Переменная должна жить только в течение генерирования страницы. Пробовал использовать static, но в таком виде она сохраняется при переходе на другую страницу.
если только в течение генерации страницы, точнее, в течение обработки запроса, можно положить в HttpContext.
HttpContext.Current.Items["userName"] = "vasya";
...
string name = (string)HttpContext.Current.Items["userName"];
Что касается static, то могу предолжить еще поставить на нее атрибут ThreadStatic, тогда эта переменная будет статической для потока (то есть фактически для акта обработки запроса), а для разных потоков будет иметь разные значения.
В общем, вариантов масса, и все о кривизне: ну зачем так делать-то? Есть отличная штука — IPrincipal и IIdentity. У последней есть свойство Name. Все это добро лежить в HttpContext.Current.User, бери и пользуйся. Кладется туда при аутентификации пользователя.
Здравствуйте, flashion, Вы писали:
F>Здравствуйте, Морской дьявол, Вы писали:
МД>>Здравствуйте, flashion, Вы писали:
F>>>Попробуйте ее получить юзер-контролом. МД>>А... Тогда точно не понял задачу. А наоборот, встроить переменную в пользовательский контрол и задавать его значение из страницы?
F>Да! Но только не так, чтобы сделать, скажем, 10 контролов, которые будут использовать одно и то же свойство и на странице задавать это свойство для каждого контрола по отдельности, а создать свойство класса страницы, а из нужных контролов запрашивать это свойство.
А чем просто свойство страницы неподходит?
private string temp = "Value";
public string Temp
{
get { return temp; }
}
Здравствуйте, flashion, Вы писали:
F>Подскажите, pls:
F>На странице Default.aspx нужно создать переменную, например userName. Контролу, который подключен к этой старнице нужно получить эту переменную. Переменная должна жить только в течение генерирования страницы. Пробовал использовать static, но в таком виде она сохраняется при переходе на другую страницу.
F>Вроде простейшая задача, но никак не получается ее решить.
F>.NET 2.0 Beta 2
В коде страницы:
public class MyPage:System.Web.UI.Page
...........
private string _userName=string.Empty;
public string UserName{
get{ return _userName;}
}
.....
//инициализация
.........
_userName = "Vasya Pupkin";
....
Необходимо, чтобы переменная _userName была инициализирована до того, как контрол к ней обратится
-------------------------------------------
А вообще, например, у себя я делал так: при входе пользователя, я сохранял объект "Пользователь" в сессии (мне был небходим доступ ко всем полям оббъекта), а при необходимости брал информацию оттуда, где-то ASP-вставками, где-то в коде.
Доступ к переменным их контрола
От:
Аноним
Дата:
17.06.05 09:46
Оценка:
System.Web.HttpContext.Current.Items поможет.
Эта коллекция существует только во время обработки запроса.
На странице Default.aspx нужно создать переменную, например userName. Контролу, который подключен к этой старнице нужно получить эту переменную. Переменная должна жить только в течение генерирования страницы. Пробовал использовать static, но в таком виде она сохраняется при переходе на другую страницу.
Вроде простейшая задача, но никак не получается ее решить.
.NET 2.0 Beta 2
Привет, ну вроде должно вот так:
((<название класса, который содержит данный компонент>)this.Parent).userName
Важное замечание — уровень доступа к userName должен быть public, т.е.
public <тип> userName
Вот такие вот пирожкиС уважением, MEPhIst aka Миф .
Можно ли поподробнее, что Вы имели ввиду о IPrincipal и IIdentity? Как можно их использовать для данной задачи? Не могли бы Вы все также описать, как в предыдущем примере?
[ThreadStatic] почему-то сохраняется так же, как просто static
тоже виден всем юзерам на всех страницах пишу так: [ThreadStatic] public static string MyVariable;
Так скорее всего все ваши запросы обрабатываются в одном и том же потоке.
Да, я так делал, но не получается Ругается:
CS0246: The type or namespace name 'PageClass' could not be found (are you missing a using directive or an assembly reference?) Объявляю класс страницы так:
public partial class PageClass : System.Web.UI.Page Контрол вставляю так:
<%@ Register Src="App_Controls/MyControl.ascx" TagName="MyControl" TagPrefix="myTag" %>
<myTag:MyControl ID="MyControl" runat="server" /> VS 2005 мой PageClass внутри контрола даже не видит. Что я не так делаю?
Подскажите, плиз!
А импортировали то пространство имен в котором public partial class PageClass : System.Web.UI.Page
Туда где описан юзерконтрол?
Здравствуйте, flashion, Вы писали:
F>Да, я так делал, но не получается
F>Ругается: F>CS0246: The type or namespace name 'PageClass' could not be found (are you missing a using directive or an assembly reference?)
F>Объявляю класс страницы так: F>public partial class PageClass : System.Web.UI.Page
F>Контрол вставляю так: F><%@ Register Src="App_Controls/MyControl.ascx" TagName="MyControl" TagPrefix="myTag" %> F><myTag:MyControl ID="MyControl" runat="server" />
F>VS 2005 мой PageClass внутри контрола даже не видит.
F>Что я не так делаю? F>Подскажите, плиз!
F>данное сообщение получено с www.gotdotnet.ru F>ссылка на оригинальное сообщение
А ты где обращаешься к переменной? C помощью ASP-вставки или непосредственно из кода?
Насколько я понял — ASP вставка. Проверь есть ли в using секции юзер-контрола ссылка на namespace страницы и если есть
то должно быть так:
namespace Project.MyControls{
using Project.Pages;
....
}
а не так:
using Project.Pages;
namespace Project.MyControls{
...
}
Здравствуйте, AlexGK, Вы писали:
AGK>Здравствуйте, flashion, Вы писали:
F>>Да, я так делал, но не получается
F>>Ругается: F>>CS0246: The type or namespace name 'PageClass' could not be found (are you missing a using directive or an assembly reference?)
F>>Объявляю класс страницы так: F>>public partial class PageClass : System.Web.UI.Page
F>>Контрол вставляю так: F>><%@ Register Src="App_Controls/MyControl.ascx" TagName="MyControl" TagPrefix="myTag" %> F>><myTag:MyControl ID="MyControl" runat="server" />
F>>VS 2005 мой PageClass внутри контрола даже не видит.
F>>Что я не так делаю? F>>Подскажите, плиз!
F>>данное сообщение получено с www.gotdotnet.ru F>>ссылка на оригинальное сообщение
Признаю: не прав. Это я говорил про VS 2003. Попрбовал в Visual Web develoer , многое они там поменяли...... не понимаю почему, но действиетльно нельзя обратиться к типу страницы.... ЕДинственное до чего додумался:
Создаешь файл класса, в нем определяешь интерфейс:
public interface IValue
{
string Value
{
get;
}
}
на странице в которой ты помещаешь данные
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class MyPage : System.Web.UI.Page,IValue
{
private string _val = "";
string IValue.Value
{
get { return _val; }
}
protected void Page_Load(object sender, EventArgs e)
{
_val = "Vasya Pupkin";
}
}
В юзер контроле:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ASP;
public partial class wc : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
this.Label1.Text = ((IValue)this.Page).Value;
}
}
===========
Согласен, что это кривовато. Решение получено с целью доказать Visual Web Developer, что я ее обману
Позже дам нормальное решение.
Re[3]: Доступ к переменным их контрола
От:
Аноним
Дата:
21.06.05 06:43
Оценка:
Всем огромное спасибо за ответы!!!!!!!!!!!!!!!!
Тут пару раз Вы предлагали решение, связанное с namespace.
В общем, почему-то, .NET ругается, когда класс страницы или контрола пытаешься включить в какой-либо namespace.
namespace myNamespace
{
public partial class myClass : System.Web.UI.UserControl
{
...
CS0115: 'ASP.myControlascx.FrameworkInitialize()': no suitable method found to override
Здравствуйте, flashion, Вы писали:
F>Всем огромное спасибо за ответы!!!!!!!!!!!!!!!!
F>Тут пару раз Вы предлагали решение, связанное с namespace. F>В общем, почему-то, .NET ругается, когда класс страницы или контрола пытаешься включить в какой-либо namespace.
F>namespace myNamespace F>{ F> public partial class myClass : System.Web.UI.UserControl F> { F> ...
F>CS0115: 'ASP.myControlascx.FrameworkInitialize()': no suitable method found to override
Да, это я понял, когда попробовал все проделать на VWD 2005. Вечером попробую с ним разобраться. Пока что есть лишь идеи с интерфейсами см. выше F>данное сообщение получено с www.gotdotnet.ru F>ссылка на оригинальное сообщение
Здравствуйте, AlexGK, Вы писали:
AGK>Здравствуйте, flashion, Вы писали:
F>>Всем огромное спасибо за ответы!!!!!!!!!!!!!!!!
F>>Тут пару раз Вы предлагали решение, связанное с namespace. F>>В общем, почему-то, .NET ругается, когда класс страницы или контрола пытаешься включить в какой-либо namespace.
F>>namespace myNamespace F>>{ F>> public partial class myClass : System.Web.UI.UserControl F>> { F>> ...
F>>CS0115: 'ASP.myControlascx.FrameworkInitialize()': no suitable method found to override
AGK> Да, это я понял, когда попробовал все проделать на VWD 2005. Вечером попробую с ним разобраться. Пока что есть лишь идеи с интерфейсами см. выше F>>данное сообщение получено с www.gotdotnet.ru F>>ссылка на оригинальное сообщение
Посмотрел в дизассемблере... нет слов, одни чувства, юзер контрол находится в одной сборке, страница — в другой (может, это потому что я работаю без IIS?). Советую посмотреть и тебе.
Здравствуйте, Corwin_XX, Вы писали:
C_X>Попробуйте ещё так:
C_X>В контроле сделайте паблик свойство Owner.
C_X>В коде страницы при загрузке этого контрола пишите в это свойство ссылку на страницу C_X>MyControl ctl = (MyControl) .... C_X>ctl.Owner = this;
C_X>Потом в контроле обращайтес к паблик свойствам страницы.
C_X>данное сообщение получено с www.gotdotnet.ru C_X>ссылка на оригинальное сообщение
Чтобы к чему-то обратиться, нужно знать тип этого чего-то. Ссылку на объект-страницы я и так имею
MyControl.Page
Re[6]: Доступ к переменным их контрола
От:
Аноним
Дата:
28.06.05 12:52
Оценка:
MyControl.Page — не совсем то. Например, ты можешь грузить свой конотрол из другого контрола (ascx).
Насчёт типа — я не понял, как его можно не знать? Как ты описываешь свойство Owner?
Public SomeType Owner {...}
Здравствуйте, Corwin_XX, Вы писали:
C_X>MyControl.Page — не совсем то. Например, ты можешь грузить свой конотрол из другого контрола (ascx).
C_X>Насчёт типа — я не понял, как его можно не знать? Как ты описываешь свойство Owner? C_X>Public SomeType Owner {...}
Угу... Я тоже так думал. Попробуй в Visual WebDeveloper 2005 0 поймешь. На всякий случай расскажу. Есть проект в нем есть страница Default.aspx, соответственно класс c тем же именем в одноименном файле. Есть юзер-контрол, его класс, предположим wc... бла-бла-бла.
Весь прикол в том, что когда в коде страницы пишешь что-то типа:
...Page_load(..){
Type t = typeof(wc);// компилируется, работаетthis.label1.Text = t.ToString();
}
а если пишешь в коде контрола
...Page_load(..){
Type t = typeof(Default);// возможны варианты - _default , default this.label1.Text = t.ToString();
}
То он ругается на этапе компиляции, мол, не знает он такого класса Default. Это верно не только для дефолтовой страницы но и для всех страниц. Ради прикола можешь посмотреть что компилятор дает на выходе. Попробуй проделать, я тоже не мог поверить в это