在我的ASCX中,我有一个定义为<asp:HiddenField ID="hdnNewAsset" runat="server" />
的asp.net隐藏字段。
在Code Behind中我有以下代码:
protected void Page_Load(object sender, EventArgs e)
{
_service = new ArticleDataService(PortalId);
if (!IsPostBack)
{
string rawId = Request[ArticleQueryParams.ArticleId];
DisplayArticleDetails(rawId);
}
if (hdnNewAsset.Value.Trim() != string.Empty)
ProcessNewAsset();
}
现在,在我的前端,我有一个javascript函数来响应事件并设置隐藏字段并触发回发:
function assetSelected(assetGuid) {
$('input[id*="hdnNewAsset"]').val(assetGuid);
__doPostBack()
}
正在发生的事情是我的隐藏字段正在标记中设置(chrome [
<input type="hidden" name="dnn$ctr466$Main$ctl00$hdnNewAsset" id="dnn_ctr466_Main_ctl00_hdnNewAsset" value="98d88e72-088c-40a4-9022-565a53dc33c4">
]
显示$('input[id*="hdnNewAsset"]')
}。
但是,当发生回发时,hdnNewAsset.Value
是一个空字符串。
更令人费解的是,在Page_Load
Request.Params["dnn$ctr466$Main$ctl00$hdnNewAsset"]
的开头显示98d88e72-088c-40a4-9022-565a53dc33c4
,并且在回发后我的隐藏字段具有相同的值(因此隐藏字段在回发中保持不变),但我无法通过hdnNewAsset.Value
访问此值。
谁能看到我做错了什么?
答案 0 :(得分:0)
好的,我发现了问题。
问题是上面发布的代码是ASCX用户控件的一部分。在父控件的Page_Load
事件期间,该用户控件被动态加载到asp.net占位符中。
因此,似乎因为这两个调用都在它们各自调用的Page_Load
中,所以内部控件没有将它的值绑定在内部控件的page_load
中。修改它以便我的内部控件加载到Page_Init
而不是Page_Load
修复了所有绑定。
不确定我是否以对公众有意义的方式写出来。
<小时/> 修改:似乎this part of the MSDN documentation与我的问题相关:
如果控件是在运行时动态创建的,或者在数据绑定控件的模板中以声明方式创建,则它们的事件最初不会与页面上其他控件的事件同步。例如,对于在运行时添加的控件,Init和Load事件可能在页面生命周期的后期发生,而不是以声明方式创建的控件的相同事件。因此,从它们实例化时起,模板中动态添加的控件和控件会一个接一个地引发它们的事件,直到它们赶上将它添加到Controls集合中的事件。