BechinOleg
Дата: 02.06.2008 10:38:09
Доброе утро! Недавно соскочил с WinForms на ASP и еще не совсем врубаюсь в принципы работы c ASP, а собственно столкнулся вот с чем:
Есть некий юзер контрол, унаследованный соответственно от UserControl и от System.Web.UI.ICallbackEventHandler, состоящий допустим из DDL с 3-мя итемами и кнопки. В нем есть свойство Value реализованное как положено через get, set:
private string _vl;
public string MValue
{
get
{
return this.DDL_Values.SelectedValue;
}
set
{
VlChanged(this, new HelperValueChangedEventArgs(value));
this.DDL_Values.SelectedValue = value;
}
}
делегат ValueChanged:
public delegate void HelperValueChangedEventHandler(object sender, HelperValueChangedEventArgs e);
public class HelperValueChangedEventArgs
{
public HelperValueChangedEventArgs()
{
}
public HelperValueChangedEventArgs(string vl)
{
_vl = vl;
}
private string _vl;
public string value
{
get
{
return _vl;
}
set
{
_vl = value;
}
}
}
public event HelperValueChangedEventHandler ValueChanged;
private void VlChanged(MyUserControl sender, HelperValueChangedEventArgs e)
{
if (ValueChanged != null)
{
ValueChanged(sender, e);
}
}
а так же RaiseCallbackEvent и GetCallbackResult:
public void RaiseCallbackEvent(string eventArgument)
{
if (eventArgument != null)
{
MValue = eventArgument;
}
}
public string GetCallbackResult()
{
string str = "";
return str;
}
В Page_Load описание скриптов (пример взят из MSDN):
string cbReference = Page.ClientScript.GetCallbackEventReference(this,
"arg", "ReceiveServerData", "context");
string callbackScript = "function CallServer(arg, context)" +
"{ " + cbReference + "} ;";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(),
"CallServer", callbackScript, true);
Далее сам скрипт:
<script type="text/javascript">
function LookUpSelectedValue()
{
var ddl = document.getElementById('<%= DDL_Values.ClientID %>');
var res = ddl .SelectedValue;
CallServer(res , "");
}
function ReceiveServerData(rValue)
{
// здесь типа обработка возврата от сервера
}
</script>
В кнопке юзер контрола: OnClientClick="LookUpSelectedValue();"
UC как положено описан в Web.config
Далее в странице Default добавляем тот самый UC с OnValueChanged = "valueChanged" и простой TextBox, в valueChanged следующее:
protected void valueChanged(object sender, HelperValueChangedEventArgs e)
{
this.TextBox1.Text = e.value;
this.TextBox1.Focus();
}
Закпускаем и смотрим... Значение в DDL есть, нажимаю кнопку, получаю следующий сценарий: Отрабатывает CallServer в скрипте, в RaiseCallbackEvent ловлю eventArgument, в нем сидит то, что выбрано в DDL, все четко, далее (как описано выше) отправляем eventArgument в свойство MValue, отрабатывает VlChanged, тоже все четко, переходим на страницу Default и смотрим на valueChanged. Процедура отрабатывает, в e.value то что нужно (SelectedValue дроп дауна). Все происходит по задуманному и логичному сценарию, НО... на странице ничего не происходит!!! TexBox1 как был пустой и без фокуса так таким и остался! Народ помогите заполнить пробел в знаниях. Подскажите, что я не так сделал или пропустил. Заранее благодарен!
BechinOleg
Дата: 04.06.2008 11:26:47
В примере выше не сама задача, а просто попытка отработать технологию. Собственно сама задача такая: Есть юзер контрол, с какими то свойствами, по нажатию кнопки из джаваскрипта открывается модальное окно, которое что-то там возвращает, так вот нужно отловить на сервере, что это самое "что-то" изменилось. Решения кроме создания event'а я не нашел, может быть есть идеи получше?