我是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
进行了检查。
你能帮我理解一下这个错误的根源吗?
提前致谢!
答案 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”以匹配。