저는 Visual Studio 웹 사이트 프로젝트에서 비롯된 이전 사이트에서 작업 중이며 다른 작업 외에도 웹 응용 프로그램으로 변환 중입니다. 사이트의 한 페이지는 GridView를 사용하고 DataTable을 사용하여 코드 숨김으로 DataSource를 설정합니다. GridView는 몇 개의 BoundField와 그 안에 확인란이있는 하나의 TemplateField를 노출합니다. GridView는 EnableViewState를 사용하도록 구성됩니다.asp.net GridView는 ViewState를 사용할 수 있습니까?
<asp:GridView ID="Results" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" EnableViewState="true">
<AlternatingRowStyle BackColor="White" ForeColor="#284775" />
<Columns>
<asp:BoundField DataField="Type" HeaderText="Type"/>
<asp:BoundField DataField="ProcessDate" HeaderText="Process Date" />
<asp:BoundField DataField="Classification" HeaderText="Classification" />
<asp:BoundField DataField="Email" HeaderText="Email" />
<asp:TemplateField HeaderText="Notify?" ItemStyle-HorizontalAlign="Center">
<EditItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" onclick="EnableSubmit(this);" />
</EditItemTemplate>
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" onclick="EnableSubmit(this);" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
이 페이지는 또한 제출 버튼을 가지고 있으며, _CLICK 핸들러에서, 코드는 Results.Rows
를 잡기 위해 시도한 다음 행이 체크 박스를 체크 한 결정하기 위해 주변에 판다. 검사 된 행을 기반으로 후속 처리를 수행합니다.
- 이전 사이트 코드는 IsPostBack 검사를 수행하고 false 일 때만 DataBind를 호출합니다.
- 이 페이지는 EnableViewState 또는 ViewStateMode를 정의하지 않습니다. 즉, MSDN에 따르면이 둘은 모두 기본값으로 true입니다.
- 마스터 페이지 또는 기타 항목에 DataBind를 호출 할 필요가 없습니다.
- 이전 사이트 코드는 ViewState 사전에 지속되는 수동 작업을 수행하지 않습니다.
- 놀랍게도이 사이트의 제작 버전이 실제로 작동합니다.
나는이 작업을 수행해 왔기 때문에 GridView에서 ViewState를 실제로 사용하지 않는 방법과 사용자에게 보낸 데이터를 사용하는 방법, DataTable을 DataSource는 Code Behind 등에서 ViewState에 수동으로 삽입해야합니다.
내가 작업하고있는 사이트의 버전이 웹 응용 프로그램 프로젝트로 변환되었으며 .NET 4.5를 대상으로합니다. 사이트를 디버그하여 Page_Load
또는 Submit_Click
에 도달하면 Results
GridView에 null DataSource가 있고 Rows 속성의 수가 0입니다. 이것은 GridView가 "작동하는 방식"에 관한 현재의 일반적인 지혜와 일치하는 것으로 보입니다.
나는이 사이트의 기능에 대해 매우 까다로운 구현이며이를 수행하는 훨씬 더 좋은 방법이 있음을 잘 알고 있습니다. 그러나 내가 가장 염려하는 점은 이전 버전이 어떻게 작동하는지에 대한 설명을 찾을 수 없다는 것입니다.
GridView는 EnableViewState 속성을 무시하기 위해 히스토리의 특정 시점에서 변경 되었습니까? GridView에서 EnableViewState는 실제로 무엇을합니까? 웹 사이트와 웹 응용 프로그램 프로젝트의 차이점이 있습니까?
어떻게 이것이 가능합니까?
업데이트 : Bert Evans의 예제 페이지를 기반으로이 수정 된 페이지를 사용해 보았습니다.
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
public class Thing
{
public int ID { get; set; }
public string Name { get; set; }
}
IEnumerable<Thing> Things
{
get
{
var things = new List<Thing>();
things.Add(new Thing { ID = 1, Name = "One" });
things.Add(new Thing { ID = 2, Name = "Two" });
things.Add(new Thing { ID = 3, Name = "Three" });
things.Add(new Thing { ID = 4, Name = "Four" });
things.Add(new Thing { ID = 5, Name = "Five" });
return things;
}
}
void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ThingGridView.DataSource = Things;
ThingGridView.DataBind();
}
pageLoadLabel.Text = string.Format("On page Load, row count: '{0}'", ThingGridView.Rows.Count);
}
void OnClickMe(object sender, EventArgs e)
{
onClickLabel.Text = string.Format("On click, row count: '{0}'", ThingGridView.Rows.Count);
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView runat="server" ID="ThingGridView">
<Columns>
<asp:BoundField HeaderText="Name" DataField="Name" />
</Columns>
</asp:GridView>
</div>
<asp:Button runat="server" ID="ThingButton" Text="Click Me!" OnClick="OnClickMe" />
<asp:Label runat="server" ID="onClickLabel" Text="[set on click]" />
<asp:Label runat="server" ID="pageLoadLabel" Text="[set on page load]" />
</form>
</body>
</html>
유일한 차이점은 페이지 본문의 행 개수를 인쇄하는 라벨입니다. 이 페이지를 실행할 때. 첫 번째 Page_Load 호출은 행 수 5를 페이지에 인쇄합니다. 그러나 포스트 백에서는 페이지로드와 OnClick 메서드에서 행 수가 0입니다.
페이지의 HTML 마크 업에서보기 상태를 살펴보십시오. enable viewstate를 켜고 끄고 차이점을 살펴보십시오. – mason
제품 버전에서는 작동하지만 사용자 버전에서는 작동하지 않는다고 말씀 하시겠습니까? – Bert
@BertEvans 예 - 어떻게 든 이전 버전은 포스트 백 처리 중에 GridView의 Rows 속성에서 데이터를 가져 오는 작업을 관리하고 있으며 일부 SQL 액세스를 데이터 영역으로 조각하는 것을 제외하고 변경 한 내용은 모두 프로젝트를 업그레이드하고 있습니다. 웹 응용 프로그램 (그리고 아마도 더 새로운 .NET 버전 사용). – bwerks