2012-11-29 66 views
1

在我的ASCX中,我有一個定義爲<asp:HiddenField ID="hdnNewAsset" runat="server" />的asp.net隱藏字段。Asp.net隱藏字段沒有代碼後面的值,但*是*保留值回發後

在後面我有以下代碼代碼:現在

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() 
} 

發生了什麼事是我的隱藏字段正在標記中設置(鉻顯示[ <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

指定'hdnNewAsset'的代碼在哪裏?它通過'IsPostBack'檢查來保護嗎? – Kami

+1

在回發週期的什麼時候你試圖訪問該字段的值?如果你在視圖狀態被加載之前這樣做了,那麼你會得到一個空字符串。另外,你使用的是什麼瀏覽器?我在Chrome中看到類似這樣的問題(但僅在Chrome中)。嘗試其他瀏覽器,看看你是否得到相同的結果。 –

+0

@Kami:沒有什麼值得設置,我只能通過前端 – KallDrexx

回答

0

好吧,我想通了這個問題。

問題是貼上面的ASCX用戶控件的是部分的代碼。該用戶控制得在父控件的Page_Load事件中被動態加載到asp.net佔位符中

因此,由於這兩個調用都在Page_Load的各自調用中,所以內部控件沒有綁定它的值內部控制的page_load。修改i t所以我的內部控制裝載在Page_Init而不是Page_Load固定所有綁定。

不確定我是否以一種對大衆有意義的方式撰寫該文章。


編輯:看來 this part of the MSDN documentation是有關我的問題:

如果在運行時或在數據綁定控件的模板聲明動態創建的控件,他們的活動最初不同步那些頁面上的其他控件。例如,對於在運行時添加的控件,Init和Load事件可能比頁面生命週期中稍晚的時間發生,而不是聲明式創建的控件的相同事件。因此,從實例化的時間開始,動態添加的模板中的控件和控件一個接一個地引發它們的事件,直到它們趕上將事件添加到Controls集合的事件。