创建用户向导 - 用户代码未处理空引用异常

时间:2012-12-07 11:14:23

标签: c# asp.net createuserwizard

我是ASP.NET的新手。我有一个名为RegisterUserWithRoles的createUserWiazrd取自本教程的第4步http://www.asp.net/web-forms/tutorials/security/roles/assigning-roles-to-users-cs

这是aspx文件:

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true"    
 CodeFile="CreateUsers.aspx.cs" Inherits="Membership_CreateUser" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder2" Runat="Server">
<h2>
    Create Users</h2>
<p>
    <asp:CreateUserWizard ID="RegisterWithRoles" runat="server" 
        ContinueDestinationPageUrl="~/Default.aspx" LoginCreatedUser="False" 
        onactivestepchanged="RegisterWithRoles_ActiveStepChanged">
        <WizardSteps>
            <asp:CreateUserWizardStep runat="server" />

            <asp:WizardStep ID="SpecifyRoles" runat="server" AllowReturn="False" 
                StepType="Step" Title="Specify Roles">
                <asp:CheckBoxList ID="RoleList" runat="server">
                </asp:CheckBoxList>
            </asp:WizardStep>

            <asp:CompleteWizardStep runat="server" />
        </WizardSteps>
    </asp:CreateUserWizard>
</p>
<p>

</p>
</asp:Content>

和Code Behind:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

public partial class Membership_CreateUser : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)       
    {            
        // Reference the SpecifyRolesStep WizardStep
        WizardStep SpecifyRolesStep = RegisterWithRoles.FindControl("SpecifyRolesStep") as     
WizardStep;

        // Reference the RoleList CheckBoxList            
        CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList;

        // Bind the set of roles to RoleList            
        RoleList.DataSource = Roles.GetAllRoles();            
        RoleList.DataBind();       
    }  
}



protected void RegisterWithRoles_ActiveStepChanged(object sender, EventArgs e)
{
    // Have we JUST reached the Complete step?       
    if (RegisterWithRoles.ActiveStep.Title == "Complete")
    {
        // Reference the SpecifyRolesStep WizardStep            
        WizardStep SpecifyRolesStep = RegisterWithRoles.FindControl("SpecifyRoles") as 
WizardStep;

        // Reference the RoleList CheckBoxList            
        CheckBoxList RoleList = SpecifyRolesStep.FindControl("RoleList") as CheckBoxList;

        // Add the checked roles to the just-added user            
        foreach (ListItem li in RoleList.Items)
        {
            if (li.Selected)
                Roles.AddUserToRole(RegisterWithRoles.UserName, li.Text);
        }
    } 
}
}

我一直收到错误

null reference exception was unhandled by user code - Object reference not set to an instance of an object.

有五个角色,我使用ASP.NET Configuration进行了检查。 你能帮我理解一下这个错误的根源吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

虽然我没有使用提供的向导来实现此功能,并且堆栈跟踪会很有用,但我有理由相信问题就在这里 -

WizardStep SpecifyRolesStep = RegisterWithRoles.FindControl("SpecifyRolesStep") as WizardStep;

您选择 SpecifyRolesStep 的FindControl ID与ASPX文件中的ID不匹配 -

<asp:WizardStep ID="SpecifyRoles" runat="server" AllowReturn="False" 
            StepType="Step" Title="Specify Roles">

“as”关键字(与使用语法(WizardStep)RegisterWithRoles.FindControl(“SpecifyRolesStep”)简单地转换相反)应该意味着即使FindControl没有,也会将SpecifyRolesStep安全地设置为null不返回对象或对象是不兼容的类型,因此最好在可能的情况下使用此“as”关键字(如此处所示),然后然后在操作生成的对象之前检查空值使用以下语法 -

if (RoleList != null)
{ 
  //code working with RoleList object
}
else
{ 
   //handle missing control
}

当然,并不总是可以继续对象为null的程序流,它可能对功能至关重要,因此除了向ApplicationException抛出更具体的错误消息之外,您可能无法处理错误帮助调试。

在这种情况下,您显然必须作为开发人员做出判断,因为他们总是花时间检查空值(并使您的代码混乱),无论如何都会抛出异常。

除了背景之外,您需要更改用于SpecifyRolesStep的FindControl参数,或者重命名ASPX中的WizardStep“SpecifyRoles”以匹配。