簡體   English   中英

如何提交Sharepoint頁面並保留其狀態(防止其重新初始化)?

[英]How can I submit a Sharepoint page and retain its state (prevent it from re-initializing)?

我有一個Sharepoint網頁,開頭只是給用戶一個問題。 他們回答后,將創建頁面的其余部分。 當用戶通過“保存”按鈕提交頁面時,頁面將恢復為其初始(幾乎空白)狀態。

我正在嘗試解決此問題-我希望頁面返回到以前的,提交前的榮耀。

由於新實例的ID與以前的實例具有相同的ID(我認為是“主鍵違規”),我不希望重新創建以前創建的元素時遇到問題。

因此,在發布有關這種情況的信息后 ,我想我想出了解決方案,當我添加代碼以根據實例化發生的時間使每個ID唯一時:

ckbxIMInsider.ID = GetYYYYMMDDHourMinSecMs() + "ckbxUCSCFacultyStaffOrStudent";

// For making IDs unique, when the same elements are created multiple times (such as before and after form submission)
private string GetYYYYMMDDHourMinSecMs()
{
    DateTime dt = DateTime.Now;
    String dateYYYYMMDD = dt.ToString("yyyyMMdd");
    int Hour = dt.Hour;
    int Min = dt.Minute;
    int Sec = dt.Second;
    int Millisec = dt.Millisecond;
    String HourMinSecMilliConcat = String.Format("{0}{1}{2}{3}", Hour, Min, Sec, Millisec);
    return String.Format("{0}{1}", dateYYYYMMDD, HourMinSecMilliConcat);
}

這樣,我得到了像這樣的元素的ID:

因此,隨后的創作在提交頁面應該產生一個新的和不同的ID的元素,如“ctl00_ctl24_g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33_ctl00_2015072210842379boxemailsection1”或什么,而不是“ctl00_ctl24_g_5f3fedca_19f7_4bc3_b84e_efbef0c48a33_ctl00_2015072210754251boxemailsection1”

但是,它仍然不起作用。 我得到了可怕的“錯誤,發生了意外錯誤”。 具有相當神秘的相關性ID。 在日志文件中進行追蹤,我看到了這個特別有趣的條目:

2015年7月22日09:51:38.33 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation運行時tkau意外的System.Web.HttpException:無法加載viewstate。 加載視圖狀態的控制樹必須與在上一個請求期間用於保存視圖狀態的控制樹匹配。 例如,當動態添加控件時,在回發期間添加的控件必須與在初始請求期間添加的控件的類型和位置匹配。 在DirectPaymentSectionsWebPart.DPSVisualWebPart.DPSVisualWebPartUserControl.GetSection1Table(Boolean cre8HiddenField)的System.Web.UI.Control.AddedControl(控制控件,Int32索引)的System.Web.UI.Control.LoadViewStateRecursive(對象saveState)處DirectPaymentSectionsWebPart.DPSVisualWe上的GenerateSection1(Boolean cre8HiddenField)... 2150ed41-3b86-42ac-93bf-72da4e68cec3

因此它告訴我:“ 將視圖狀態加載到其中的控制樹必須與在上一個請求期間用於保存視圖狀態的控制樹相匹配... ”但是為什么不匹配,這是我不理解的。

對於完整上下文,從相關ID的首次出現(日志文件中的第1240行)到相同ID的最后一個出現(1254行):

2015年7月22日09:51:37.50 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation日志記錄關聯數據xmnv介質名稱=請求(POST: https ://financial.ucsc.edu:443/Pages/FinAff_Demo_Page_Clay.aspx)2150ed41- 3b86-42ac-93bf-72da4e68cec3 2015年7月22日09:51:37.52 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation監視b4ly高離開監視范圍(GetFileAndMetaInfo)。 執行時間= 14.7337161566624 2150ed41-3b86-42ac-93bf-72da4e68cec3 07/22/2015 09:51:37.52 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation監視b4ly高離開監視范圍(GetWebPartPageContent)。 執行時間= 14.945265389875 2150ed41-3b86-42ac-93bf-72da4e68cec3 07/22/2015 09:51:37.52 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation日志記錄相關數據xmnv Medium Site = / 2150ed41-3b86-42ac-93bf-da372 / 22/2015 09:51:37.52 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation監視b4ly高離開監視范圍(PostResolveRequestCacheHandler)。 執行時間= 19.2141040271878 2150ed41-3b86-42ac-93bf-72da4e68cec3 07/22/2015 09:51:37.65 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation監視b4ly高離開監視范圍(EnsureListItemsData)。 執行時間= 127.102117727253 2150ed41-3b86-42ac-93bf-72da4e68cec3 07/22/2015 09:51:37.66 w3wp.exe(0x1E08)0x1FBC Web內容管理內容部署78fl意外的SiteCacheSettings.IsImportInProgress標志設置為true,但是import長時間沒有更新。 2150ed41-3b86-42ac-93bf-72da4e68cec3 2015年7月22日09:51:37.73 w3wp.exe(0x1E08)0x1FBC Web內容管理發布7fz3中設置[顯示]為當前頁面的FormContext.FormMode 2150ed41-3b86-42ac -93bf-72da4e68cec3 07/22/2015 09:51:37.73 w3wp.exe(0x1E08)0x1FBC Web內容管理發布7fz3中號[Display]設置為當前頁面的FormContext.FormMode 2150ed41-3b86-42ac-93bf-72da4e68cec3 07 / 22/2015 09:51:37.76 w3wp.exe(0x1E08)0x1FBC文檔管理服務器文檔管理cm6w中型模板發現/ InitScriptData:無法獲取用戶配置文件,當前上下文中不存在UserProfileApplicationProxy 2150ed41-3b86-42ac-93bf-72da4e68cec3 07 / 22/2015 09:51:37.76 w3wp.exe(0x1E08)0x1FBC文檔管理服務器文檔管理cm6w中型模板發現/ InitScriptData:無法獲取用戶配置文件,當前上下文中不存在UserProfileApplicationProxy 2150ed41-3b86-42ac-93bf-72da4e68cec3 07 / 22/2015 09:51:38.08 w3wp.exe(0x1E 08)0x1FBC SharePoint Foundation監視b4ly高離開監視范圍(EnsureListItemsData#1)。 執行時間= 277.14073995438 2150ed41-3b86-42ac-93bf-72da4e68cec3 07/22/2015 09:51:38.33 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation運行時tkau意外的System.Web.HttpException:無法加載viewstate。 加載視圖狀態的控制樹必須與在上一個請求期間用於保存視圖狀態的控制樹匹配。 例如,當動態添加控件時,在回發期間添加的控件必須與在初始請求期間添加的控件的類型和位置匹配。 在DirectPaymentSectionsWebPart.DPSVisualWebPart.DPSVisualWebPartUserControl.GetSection1Table(Boolean cre8HiddenField)的System.Web.UI.Control.AddedControl(控制控件,Int32索引)的System.Web.UI.Control.LoadViewStateRecursive(對象saveState)處GenerateSection1(布爾cre8HiddenField)在DirectPaymentSectionsWebPart.DPSVisualWe ... 2150ed41-3b86-42ac-93bf-72da4e68cec3 2015年7月22日09:51:38.33的w3wp.exe(0x1E08)0x1FBC的SharePoint Foundation運行tkau意外... bPart.DPSVisualWebPartUserControl。 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp,Object o,Object t,EventArgs e)在System.Web.Util.CalliEventHandlerDelegateProxy.Callback(System系統中的Object sender,EventArgs e) System處System.Web.UI.Control.LoadRecursive()處的System.Web.UI.Control.LoadRecursive()處System.Web.UI.Control.LoadRecursive()處的.Web.UI.Control.OnLoad(EventArgs e) .Web.UI.Cont System.Web.UI.Control.LoadRecursive()的System.Web.UI.Control.LoadRecursive()的System.Web.UI.Control.LoadRecursive()的System.Web.UI.Page的rol.LoadRecursive()。 ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint,Boolean includeStagesAfterAsyncPoint)2150ed41-3b86-42ac-93bf-72da4e68cec3 2015年7月22日09:51:38.47 w3wp.exe(0x1E08)0x1FBC SharePoint Foundation監視b4ly中離開監視范圍(請求(POST: https: /financial.ucsc.edu:443/Pages/FinAff_Demo_Page_Clay.aspx ))。 執行時間= 968.813145246114 2150ed41-3b86-42ac-93bf-72da4e68cec3 *

確保在提交之前保留頁面的最后狀態是一個普遍的要求,而且並不是那么困難。 您會認為這樣做的能力將通過布爾值(例如“ retainPriorState”或類似的布爾值)公開。 或者,因為從字面上看這不可能,所以“ restorePriorState”

在編程中,本來應該很容易做到的事情通常會變得很困難,跳跳練習使我思考一下網絡是否真的是由國會議員和其他類型的公共罪犯發明和設計的。

UPDATE

我正在嘗試重新創建Page_Load()事件中的元素:

if (Page.IsPostBack) 
{

...在嘗試將它們設置為“可見”后,此方法無效(因為它們被視為null); 所以它是一個“ Catch-22”:我無法將元素(面板/ div)設置為可見,因為它們在回發中為null,但是我無法重新創建它們,因為...為什么? 我不知道....

更新2

可見性顯然不是一種注意到的狀態。 當我提交表單/頁面時,所有動態創建的元素都是可見的。 但是,在回發中,所有動態創建的元素都不可見。

我以為我可以通過在Load_Page()事件中強制切換導致元素可見的單選按鈕來避免這種情況,如下所示:

if (IsPostBack)
{
    rbPaymentForSelf.Checked = false;
    rbPaymentForSelf.Checked = true;
}

我的方法的瘋狂之處在於單選按鈕(rbPaymentForSelf)在回發時已經保留了檢查狀態,因此要觸發事件(jQuery *),我需要先將其關閉然后再重新打開。

  • 這是我要通過選中/取消選中單選按鈕觸發的jQuery:

    $(document).on(“ click”,'[id $ = rbPaymentForSelf]',function(){if(this.checked){$('[id $ = panelSection2]')。slideUp(); $(' [ID $ = panelSection3]')效果基本show();

      show_sections(); $('[id$=rbPaymentToIndividual]').attr('checked', true).click(); $('[id$=boxemailsection1]').val(function () { return $('[id$=hfuseremail]').val(); }) } 

    });

    函數show_sections(){$('[id $ = panelSection1]')。slideDown(); $( '[ID $ = panelSection4]')了slideDown(); $( '[ID $ = panelSection5]')了slideDown(); $( '[ID $ = panelSection5B]')了slideDown(); $( '[ID $ = btnSave]')了slideDown(); }

我的想法是,如果上面的代碼有效,我將根據Session變量的內容確定要切換的單選按鈕。 但是,POC甚至無法正常工作,因此它又回到了編碼板中。

我將嘗試立即禁用ViewState ...

更新3

this.EnableViewState = false;

...什么都沒有改變(對我來說,很奇怪(反正),但是是真的)。

我在MSDN的Blog上發現了此問題: 為什么我們收到異常“無法加載viewstate”

以下是摘要,以防鏈接斷開:

原因

[F]或當前的POST-BACK請求,當您嘗試動態添加控件時,將對新添加的控件進行驗證,並查看它是否與先前VIEWSTAT中存儲的控件匹配。 如果沒有,您將獲得上述例外。

解析度

選項1:

您可以禁用此ASPX頁面的VIEWSTATE:
<%@頁面語言=“ C#” AutoEventWireup =“ true” CodeBehind =“ #####。aspx.cs” Inherits =“ #####” EnableViewState =“ false”%>

選項2:

您還可以更改源代碼,以確保在回發期間添加的控件必須與在初始請求期間添加的控件的類型和位置匹配。

手指交叉可以幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM