2

ASP.NET は初めてです。このチュートリアルのステップ 4 から取得した RegisterUserWithRoles という名前の createUserWiazrd があります 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>

およびコード ビハインド:

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.

5つの役割があり、 で確認しましたASP.NET Configuration。このエラーの原因を理解していただけますか。

前もって感謝します!

4

1 に答える 1

0

私はこの機能のために提供されたウィザードを使用しておらず、スタック トレースが役立つでしょうが、問題がここにあるとかなり確信しています。

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

選択している FindControl ID SpecifyRolesStepが ASPX ファイルの ID と一致しません-

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

"as" キーワード (構文(WizardStep)RegisterWithRoles.FindControl("SpecifyRolesStep")を使用して単純にキャストするのではなく) は、FindControl がオブジェクトを返さない場合やオブジェクトが互換性のない型であるため、可能な場合はこの「as」キーワードを使用して (ここにあるように)、 nullチェックしてから、次の構文を使用して結果のオブジェクトを操作することをお勧めします。

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

もちろん、オブジェクトが null の場合にプログラム フローを継続できるとは限りません。これは機能にとって重要な場合があるため、デバッグを支援するためのより具体的なエラー メッセージで ApplicationException をスローする以外にエラーを処理できない場合があります。

この場合、開発者として、とにかく例外をスローするだけの場合に、常に null をチェックする (そしてコードを混乱させる) 時間を取ることについて、明らかに判断を下す必要があります。

背景はさておき、SpecifyRolesStep に使用している FindControl パラメータを変更するか、一致するように ASPX で WizardStep の名前を「SpecifyRoles」に変更する必要があります。

于 2013-01-13T10:38:48.557 に答える