【问题标题】:Found 2 elements with non-unique id #__VIEWSTATE找到 2 个具有非唯一 ID #__VIEWSTATE 的元素
【发布时间】:2018-12-08 08:48:14
【问题描述】:

我正在开发一个旧版 ASP.NET 应用程序,该应用程序在一个网页上呈现两个表单。每个表单都实现了自己的__VIEWSTATE 字段。

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

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

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

【问题讨论】:

  • __VIEWSTATE 输入字段由框架自己添加。即使一个页面上有多个用户控件,也只会有一个 ViewState 字段。因此,除非您自己添加它们,否则不应超过 1 个。
  • @VDWWD - 页面上有多个表单元素,我相信每个元素都会创建 VIEWSTATE。这是一个 ASP.NET 2 应用程序。

标签: asp.net webforms viewstate


【解决方案1】:

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

伪代码:

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

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

嵌套.aspx:

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

至于前面提到的谷歌浏览器错误,它是一个较新的浏览器版本的newer feature

【讨论】:

    【解决方案2】:

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-01-24
      • 1970-01-01
      • 2020-05-26
      • 2020-10-24
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多