Для достижения своей цели назначьте ID
на номер _ddl
и передайте его в качестве аргумента в GetPostBackEventReference
.
DropDownList _ddl = new DropDownList();
_ddl.ID = "MyDropDownList";
_ddl.Attributes.Add(HtmlTextWriterAttribute.Onchange.ToString()
, this.Page.ClientScript.GetPostBackEventReference(this, _ddl.ID));
Тогда в RaisePostBackEvent
вам нужно найти свой контроль в соответствии с его ID
представленного в eventArgument
и таким образом получить SelectedValue
.
public void RaisePostBackEvent(string eventArgument)
{
DropDownList _ddl = FindControl(eventArgument) as DropDownList;
if (_ddl == null) return;
string selectedValue = _ddl.SelectedValue;
// do whatever you need with value
}
Почему вы не можете использовать JavaScript this.value
? Там нет поддержки JavaScript вызовов, и если вы посмотрите на генерируемой HTML вы увидите:
__doPostBack('ctl02','MyDropDownList');
Где __doPostBack
функция имеет следующий вид:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
Как вы можете видеть, что параметр recipient
равен ctl02
, который UniqueID
пользовательского элемента управления. Он попал туда, когда вы прошли this
по телефону GetPostBackEventReference
. eventArgument
Значение присваивается __EVENTARGUMENT
спрятал поле, а затем отправлено с формой. Это второй параметр вызова GetPostBackEventReference
.
Таким образом, второй паратетер GetPostBackEventReference
всегда кодируется как строка внутренним классом System.Web.UI.Util.QuoteJScriptString
.
THX для ответа, Александр –