Trace.axd показывает байты размера ViewState, даже когда ViewStateMode = "Disabled" - PullRequest
0 голосов
/ 31 января 2012

У меня есть страница Asp.net, для которой ViewStateMode = "Disabled". Однако, когда я поднимаю trace.axd, я все еще вижу много состояний для некоторых элементов управления. Я смотрю на столбец "Размер байтов ViewState (исключая дочерние элементы)" в дереве элементов управления.

например. Одним из таких элементов управления является
ctl00 $ WMge $ SLMP $ ctl00 $ rptRows $ ctl07 $ ctl02 System.Web.UI.DataBoundLiteralControl 4642 1824 0

Но когда я смотрю на состояние страницы, оно довольно маленькое и выглядит правильно. Любая идея, что может быть причиной такой большой разницы между состоянием просмотра, видимым в источнике страницы, и показанным в Trace.axd?

Ответы [ 2 ]

0 голосов
/ 31 января 2012

Предположим, у вас есть мастер и страница с контентом.

Страница мастера

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head runat="server">
    <title></title>
    <link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
    <asp:ContentPlaceHolder ID="HeadContent" runat="server">
    </asp:ContentPlaceHolder>
</head>
<body>
    <form runat="server">
            <asp:ContentPlaceHolder ID="MainContent" runat="server"/>
    </form>
</body>
</html>

Страница содержания

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    EnableViewState="false" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">

</asp:Content>

Это покажет вам вывод на вашей отрисованной странице.

enter image description here

Вы можете использовать приведенный ниже код, чтобы избежать этой ситуации.

using System;использование System.Web;используя System.Text;использование System.Web.UI;используя System.IO;using System.Text.RegularExpressions;

public class BasePage : Page
{
    protected override void Render(HtmlTextWriter writer)
    {
        StringBuilder sb = new StringBuilder();
        StringWriter sw = new StringWriter(sb);
        HtmlTextWriter hWriter = new HtmlTextWriter(sw);
        base.Render(hWriter);
        string html = sb.ToString();
        html = Regex.Replace(html, "<input[^>]*id=\"(__VIEWSTATE)\"[^>]*>", string.Empty, RegexOptions.IgnoreCase);
        writer.Write(html);
    }
}

Код изменяет отображаемый HTML-код.Ниже приведен конечный результат enter image description here

Ссылка

0 голосов
/ 31 января 2012

Единственный способ полностью избавиться от viewstate и связанных с ним скрытых полей, с которыми я столкнулся, - это использовать хак в коде позади.Этот хак объясняется здесь.

http://www.aspsnippets.com/Articles/How-to-disable-or-remove-ViewState-Hidden-Field-in-ASP.Net-Page.aspx

Обычно во время рендеринга страницы вы ищете скрытые поля и удаляете их.Я должен был реализовать это некоторое время назад, когда делал некоторые вещи jquery, которые вытягивали вторую страницу aspx, и состояние просмотра с этой страницы смешивалось с состоянием родительской страницы и вызывало проблемы.Другой способ избежать viewstate - просто использовать MVC, но это не вариант, если вы не начинаете новый проект.

...