1

在我的 ASCX 中,我有一个 asp.net 隐藏字段定义为<asp:HiddenField ID="hdnNewAsset" runat="server" />.

在后面的代码中,我有以下代码:

    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"]shows的开头98d88e72-088c-40a4-9022-565a53dc33c4和回发之后,我的隐藏字段具有相同的值(因此隐藏字段在回发中持续存在),但我无法通过hdnNewAsset.Value.

谁能看到我做错了什么?

4

1 回答 1

0

好的,我发现了问题所在。

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

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

不确定我是否以对公众有意义的方式写了这些。


编辑:似乎MSDN 文档的这一部分与我的问题有关:

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

于 2012-11-29T17:02:52.687 回答