J. Han提交的问题引入了NullRef异常问题。在提出解决方案时,我发现了一些使用Page_Load和LoginView的奇怪行为。
在页面完全加载之前,控件的可访问性似乎存在脱节。这导致服务器端控件被引用为空,除非你强行暴露它们。
<%@ Page Language="C#" MasterPageFile="~/Site2.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Test.WebForm1" %>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
<div ID="success" style="visibility:visible" runat="server">
<asp:button id="btnClick" onclick="btnClick_Click" runat="server" text="Click Me!" />
</div>
<div ID="fail" style="visibility:hidden" runat="server">
<asp:Button ID="btnDontClick" onclick="btnDontClick_Click" runat="server" Text="Do Not Click Me..." />
</div>
</asp:Content>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Test
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//this.Master.FindControl("LoginView1").FindControl("MainContent");
if (Page.FindControl("fail") != null)
{
fail.Style.Add("visibility", "hidden");
success.Style.Add("visibility", "Visible");
}
else
{
fail.Style.Add("visibility", "hidden");
success.Style.Add("visibility", "Visible");
}
}
protected void btnClick_Click(object sender, EventArgs e)
{
fail.Style.Add("visibility", "Visible");
success.Style.Add("visibility", "hidden");
}
protected void btnDontClick_Click(object sender, EventArgs e)
{
fail.Style.Add("visibility", "hidden");
success.Style.Add("visibility", "Visible");
}
}
}
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site2.master.cs" Inherits="Test.Site2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div id="body">
<asp:LoginView ID="LoginView1" runat="server" ViewStateMode="Disabled">
<AnonymousTemplate>
<asp:ContentPlaceHolder runat="server" ID="MainContent" />
</AnonymousTemplate>
<LoggedInTemplate>
</LoggedInTemplate>
</asp:LoginView>
</div>
</form>
</body>
</html>
第一次运行时,您应该在fail.Style.Add("visibility","hidden");
行上获得NullRef异常。我们应该注意,如果您注释掉这两条Style.Add
行,则页面呈现并且按钮按设计工作。
取消注释评论的FindControl行:
this.Master.FindControl("LoginView1").FindControl("MainContent");;
现在这次你运行它,它应该表现得像人们期望的那样。
为什么这行代码会公开控件?是否有一个“控制缓存”在进入Page_Load时没有刷新?运行FindControl()刷新此缓存?为什么这些控件都没有曝光?
也许这是设计上的,但不太可能。
希望这里的某些人能够深入了解为什么会发生这种情况....