我有一个自定义UserControl我正在使用哪些主机动态创建控件,我遇到了一个奇怪的情况,我似乎失去了ViewState信息.在我对base.SaveViewState()调用的重写的SaveViewState方法中,我希望它返回一个包含ViewState中所有内容的对象,但它返回null.
protected override object SaveViewState()
{
object[] tempState = new object[2];
tempState[0] = base.SaveViewState(); //***suspected issue here, tempState[0] == null -- why?
//? this.ViewState["CompanyID"] returns me the guid I'm expecting
//... code instantiating and populating lstDataControlInfos
tempState[1] = lstDataControlInfos;
return tempState;
}
Run Code Online (Sandbox Code Playgroud)
我在该方法中放置了一个断点,我可以使用立即窗口查询ViewState ["CompanyID"]并验证ViewState中确实存在一个CompanyID.也许我误解了一些关于ViewState的东西,但该调用是否应该返回已经存在于ViewState中的内容(包括我的CompanyID)?在重写的LoadViewState方法中,问题在回发上成为问题,因为我不再有任何方法将CompanyID从ViewState中取出; 它回来了.
protected override void LoadViewState(object savedState)
{
object[] tempState = (object[])savedState;
//tempState[0] == null, as it was stored in the previous SaveViewState call
//any reference to ViewState["CompanyID"] comes back null
base.LoadViewState(tempState[0]);
}
Run Code Online (Sandbox Code Playgroud)
我提到我有动态控件我正在序列化并从此控件中的ViewState反序列化,这些似乎都正常工作.什么会导致base.SaveViewState()在我知道事实时返回null并且可以在SaveViewState调用期间验证(通过立即窗口)ViewState中是否有数据?
我正在跟踪ASP.NET WebForms项目中的一些交叉兼容性问题,并且我遇到了一些特殊的行为.使用不同的浏览器访问同一页面会产生不同的结果,这种情况经常发生.对这个案例感到好奇的是,当我在不同的浏览器中查看源代码时,它向我展示了不同的html.
IE 10:
<td id="ctl00_MainMenu-menuItem010" onclick="javascript:skm_closeSubMenus(document.getElementById('ctl00_MainMenu'));location.href='../Nurse/nurses_patients.aspx';" onmouseover="javascript:skm_mousedOverMenu('ctl00_MainMenu',this, document.getElementById('ctl00_MainMenu'), false, '');skm_shimSetVisibility(true,'ctl00_MainMenu-menuItem010-subMenu');" onmouseout="javascript:skm_mousedOutMenu('ctl00_MainMenu', this, '');this.className='';" style="cursor:hand;"><font face="Verdana"><b>Patients</b></font></td>
Run Code Online (Sandbox Code Playgroud)
FF:
<td id="ctl00_MainMenu-menuItem010" onclick="javascript:skm_closeSubMenus(document.getElementById('ctl00_MainMenu'));location.href='../Nurse/nurses_patients.aspx';" onmouseover="javascript:skm_mousedOverMenu('ctl00_MainMenu',this, document.getElementById('ctl00_MainMenu'), false, '');" onmouseout="javascript:skm_mousedOutMenu('ctl00_MainMenu', this, '');this.className='';" style="cursor:pointer;">Patients</td>
Run Code Online (Sandbox Code Playgroud)
铬:
<td id="ctl00_MainMenu-menuItem010" onclick="javascript:skm_closeSubMenus(document.getElementById('ctl00_MainMenu'));location.href='../Nurse/nurses_patients.aspx';" onmouseover="javascript:skm_mousedOverMenu('ctl00_MainMenu',this, document.getElementById('ctl00_MainMenu'), false, '');" onmouseout="javascript:skm_mousedOutMenu('ctl00_MainMenu', this, '');this.className='';" style="cursor:pointer;">Patients</td>
Run Code Online (Sandbox Code Playgroud)
请注意IE版本中的额外<font>和<b>标记.这是一个我正在维护的旧应用程序.它使用skm Menu控件,并在控件的属性中显式设置粗体和Verdana字体.
<SKM:menu id="MainMenu" runat="server" Cursor="Pointer" ItemPadding="7" Font-Bold="True" Font-Size="12px"
Font-Names="Verdana" ItemSpacing="0" BorderColor="Black" BorderWidth="1px" BorderStyle="solid" GridLines="Both"
BackColor="silver" Layout="Horizontal">
<SelectedMenuItemStyle ForeColor="Red" BackColor="White" />
</SKM:menu>
Run Code Online (Sandbox Code Playgroud)
让我感到困惑的是,这是我们使用IE9在View Source中看到的html:
<td id="ctl00_MainMenu-menuItem010" onclick="javascript:skm_closeSubMenus(document.getElementById('ctl00_MainMenu'));location.href='../Nurse/nurses_patients.aspx';" onmouseover="javascript:skm_mousedOverMenu('ctl00_MainMenu',this, document.getElementById('ctl00_MainMenu'), false, '');skm_shimSetVisibility(true,'ctl00_MainMenu-menuItem010-subMenu');" onmouseout="javascript:skm_mousedOutMenu('ctl00_MainMenu', this, '');this.className='';" style="cursor:hand;">Patients</td>
Run Code Online (Sandbox Code Playgroud)
我正在尝试追踪是否是基于UserAgent呈现不同html的服务器,或者浏览器是否通过即时更改并在查看源时显示"已清理"版本来尝试智能.希望它不是两者的某种组合.
编辑:在将主机从Win2k3服务器迁移到Win2k3 R2服务器之前,我(或者说客户)没有注意到这一点.如果我从IE10点击R2服务器,我会得到那些额外的标签.如果我从IE10点击非R2服务器,我不会得到这些标签.完全相同的代码和IIS6.