2

CreateUserWizardをカスタムMembershipProviderと一緒に使用して、データベースにユーザーを追加しています。現在、ユーザーはデータベースに正常に追加されており、CreatedUserイベントを使用して、フォームにキャプチャされた追加情報を保存しています。これは正常に機能します。ただし、更新中のエラー状態を処理できるようにしたいと思います。

追加の詳細の更新が失敗した場合に、エラーでCreateUserWizardフォームを再表示する方法はありますか?

CreatedUserイベントにあるコードは次のとおりです。

protected void RegisterUserWizard_CreatedUser(object sender, EventArgs e)
{
    try
    {
        // Try to update the customer table with the additional information
        using (OrderEntities entities = new OrderEntities())
        {
            // Read in all the values from the form
            TextBox custTitle = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerTitle");
            TextBox custName = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerName");
            TextBox custSurname = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerSurname");
            TextBox custAddress1 = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerAddressLine1");
            TextBox custAddress2 = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerAddressLine2");
            TextBox custAddress3 = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerAddressLine3");
            TextBox custCity = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerCity");
            TextBox custCounty = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerCounty");
            TextBox custPostcode = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerPostcode");
            DropDownList custCountry = (DropDownList)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerCountry");

            Customer custInfo = entities.Customers.Where(c => c.UserName == RegisterUserWizard.UserName).FirstOrDefault();

            if (custInfo != null)
            {
                custInfo.Email = RegisterUserWizard.Email;
                custInfo.Password = RegisterUserWizard.Password;
                custInfo.Title = custTitle.Text;
                custInfo.Firstname = custName.Text;
                custInfo.Surname = custSurname.Text;
                custInfo.AddressLine1 = custAddress1.Text;
                custInfo.AddressLine2 = custAddress2.Text;
                custInfo.AddressLine3 = custAddress3.Text;
                custInfo.City = custCity.Text;
                custInfo.County = custCounty.Text;
                custInfo.Postcode = custPostcode.Text;
                custInfo.CountryID = custCountry.SelectedValue;
                custInfo.CreatedDate = DateTime.Now;

                entities.SaveChanges();

                FormsAuthentication.SetAuthCookie(RegisterUserWizard.UserName, false);

                // Redirect user back to calling page
                string continueUrl = RegisterUserWizard.ContinueDestinationPageUrl;
                if (String.IsNullOrEmpty(continueUrl))
                {
                    continueUrl = "~/";
                }
                Response.Redirect(continueUrl);

            }
            else
            {
                // Redisplay CreateUserWizard showing error message
            }
        }
    }
    catch
    {
        // Redisplay CreateUserWizard showing error message
    }
}

よろしくお願いします

4

2 に答える 2

1

コンテンツテンプレートを使用してIDErrorMessageのリテラルコントロールを追加すると、CreateUserWizardコントロールからエラーを表示できます。

<asp:Literal runat="server" EnableViewState="false" ID="ErrorMessage"></asp:Literal>
于 2012-04-24T16:21:34.577 に答える
1

OK、回避策を見つけました-これのハック

まず、変更されたCreatedUserイベントハンドラー:

protected void RegisterUserWizard_CreatedUser(object sender, EventArgs e)
{
    try
    {
        // Try to update the customer table with the additional information
        using (OrderEntities entities = new OrderEntities())
        {
            // Read in all the values from the form
            TextBox custTitle = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerTitle");
            TextBox custName = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerName");
            TextBox custSurname = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerSurname");
            TextBox custAddress1 = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerAddressLine1");
            TextBox custAddress2 = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerAddressLine2");
            TextBox custAddress3 = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerAddressLine3");
            TextBox custCity = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerCity");
            TextBox custCounty = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerCounty");
            TextBox custPostcode = (TextBox)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerPostcode");
            DropDownList custCountry = (DropDownList)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomerCountry");

            Customer custInfo = entities.Customers.Where(c => c.UserName == RegisterUserWizard.UserName).FirstOrDefault();

            if (custInfo != null)
            {
                custInfo.Email = RegisterUserWizard.Email;
                custInfo.Password = RegisterUserWizard.Password;
                custInfo.Title = custTitle.Text;
                custInfo.Firstname = custName.Text;
                custInfo.Surname = custSurname.Text;
                custInfo.AddressLine1 = custAddress1.Text;
                custInfo.AddressLine2 = custAddress2.Text;
                custInfo.AddressLine3 = custAddress3.Text;
                custInfo.City = custCity.Text;
                custInfo.County = custCounty.Text;
                custInfo.Postcode = custPostcode.Text;
                custInfo.CountryID = custCountry.SelectedValue;
                custInfo.CreatedDate = DateTime.Now;

                entities.SaveChanges();

                FormsAuthentication.SetAuthCookie(RegisterUserWizard.UserName, false);

                // Redirect user back to calling page
                string continueUrl = RegisterUserWizard.ContinueDestinationPageUrl;
                if (String.IsNullOrEmpty(continueUrl))
                {
                    continueUrl = "~/";
                }
                Response.Redirect(continueUrl);

            }
            else
            {
                // Throw an Exception so that we redisplay CreateUserWizard showing error message
                throw new Exception("An error occurred updating account details, please try again");
            }
        }
    }
    catch (Exception ex)
    {
        // Delete the incomplete user from the membership to avoid duplicate UserName errors if the user tries again
        Membership.DeleteUser(RegisterUserWizard.UserName); 

        // Store the error message in the Context and transfer back to the page preserving the form
        Context.Items.Add("ErrorMessage", ex.Message);
        Server.Transfer(Request.Url.PathAndQuery, true);
    }
}

次に、CustomValidatorをContentTemplateに追加して、エラーメッセージを表示できるようにしました。

<asp:CustomValidator ID="CustomValidator" runat="server" ValidationGroup="RegisterUserValidationGroup" />

最後に、CreatingUserイベントの新しいハンドラーを追加して、コンテキストからエラーメッセージを読み取り、CustomValidatorを使用して表示します。

void RegisterUserWizard_CreatingUser(object sender, LoginCancelEventArgs e)
{
    // If we have received an error message in the Context then cancel the CreatingUser and display the message
    if (Context.Items["ErrorMessage"] != null)
    {
        CustomValidator custValidator = (CustomValidator)RegisterUserWizard.CreateUserStep.ContentTemplateContainer.FindControl("CustomValidator");
        custValidator.ErrorMessage = Context.Items["ErrorMessage"].ToString();
        custValidator.IsValid = false;
        e.Cancel = true;
    }
}

エラーが発生した場合; わかりやすいメッセージを表示し、MembershipUserを整理することができます。最も重要なことは、ユーザーが再試行する前にすべての詳細を再入力する必要がないことです。

于 2012-04-25T22:56:57.173 に答える