繁体   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