找到2个具有非唯一ID #__VIEWSTATE的元素

时间:2018-06-29 07:57:22

标签: asp.net webforms viewstate

我正在研究一个旧式ASP.NET应用程序,该应用程序在单个网页上呈现两种形式。每个表单都实现自己的__VIEWSTATE字段。

由于Chrome v63重复的字段名称在控制台中引发错误:

  

找到2个具有唯一ID #__VIEWSTATE的元素

我无法重写应用程序以删除重复的表格。是否有另一种方法可以重命名__VIEWSTATE字段,或者其他一些解决方法?

2 个答案:

答案 0 :(得分:1)

Page类中,有两种方法可以保存和加载视图状态。通过覆盖这两种方法并将它们设置为使用另一个隐藏文件,您可以为该页面重命名__VIEWSTATE

这是您的操作方式:

public partial class SamplePage : Page
{
    const string ViewStateHiddenFiledName = "_VIEWSTATE_Page1";

    protected override void SavePageStateToPersistenceMedium(object viewState)
    {
        LosFormatter los = new LosFormatter();
        StringWriter writer = new StringWriter();

        los.Serialize(writer, viewState);

        string serilizedViewState = writer.ToString();

        ClientScript.RegisterHiddenField(ViewStateHiddenFiledName, serilizedViewState);
    }

    protected override object LoadPageStateFromPersistenceMedium()
    {
        string serilizedViewState = Request.Form[ViewStateHiddenFiledName];
        if (serilizedViewState != "")
        {
            LosFormatter los = new LosFormatter();
            return los.Deserialize(serilizedViewState);
        }
        return null;
    }
}

答案 1 :(得分:0)

如果这些表单的控件之间没有服务器端交互,则作为摆脱第二种表单的另一种方法,可以将其移动到单独的ASPx页面/表单并通过iframe加载: >

伪代码:

旧的2个表单页面(不确定,怎么可能):

<form id="form1" runat="server">
    Root Page - Form 1
</form>
<form id="form2" runat="server">
    Root Page - Form 2
</form>

新的2个表单页面:

<form id="form1" runat="server">
    Root Page - Form 1
</form>
<%--
<form id="form2" runat="server">
    Root Page - Form 2
</form>
--%>
<iframe src="Nested.aspx"></iframe>

Nested.aspx:

<form id="form2" runat="server">
    Root Page - Form 2
</form>

对于前面提到的Google Chrome浏览器错误,它是更新的浏览器版本中的newer feature