Asp.net隐藏字段后面的代码没有值,但是*在回发后是*保留值

时间:2012-11-29 16:28:27

标签: c# asp.net webforms

在我的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访问此值。

谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题。

问题是上面发布的代码是ASCX用户控件的一部分。在父控件的Page_Load事件期间,该用户控件被动态加载到asp.net占位符中。

因此,似乎因为这两个调用都在它们各自调用的Page_Load中,所以内部控件没有将它的值绑定在内部控件的page_load中。修改它以便我的内部控件加载到Page_Init而不是Page_Load修复了所有绑定。

不确定我是否以对公众有意义的方式写出来。

<小时/> 修改:似乎this part of the MSDN documentation与我的问题相关:

  

如果控件是在运行时动态创建的,或者在数据绑定控件的模板中以声明方式创建,则它们的事件最初不会与页面上其他控件的事件同步。例如,对于在运行时添加的控件,Init和Load事件可能在页面生命周期的后期发生,而不是以声明方式创建的控件的相同事件。因此,从它们实例化时起,模板中动态添加的控件和控件会一个接一个地引发它们的事件,直到它们赶上将它添加到Controls集合中的事件。