Как установить сообщения об ошибках из codebehind (элемент управления CreateUserWizard, используя TemplateLayout)?
Пользователи создаются с помощью стандартного SQLMemberShipProvider.
Я попытался поймать MembershipCreationStatus, а также исключения, и когда я отлаживаю код, я получаю метод, который устанавливает сообщения. Я установил их, используя свойства CreateUserWizardControl, но когда страница отображается, отображаются значения по умолчанию; не (пользовательские) сообщения, которые я только что установил.
У мастера, над которым я работаю, всего один шаг, но я действительно хотел бы знать, что я делаю неправильно. Я потратил больше, чем целый день, пытаясь заставить этого волшебника вести себя.
Нужна помощь или руководство.
Спасибо адам
<asp:CreateUserWizard ID="createUserWizard" runat="server"
ContinueDestinationPageUrl="/user/profile/"
CreateUserButtonText="Continue" RequireEmail="False" ActiveStepIndex="0">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server" Title="Account details">
<ContentTemplate>
<fieldset>
<legend>Account details</legend>
<div>
<asp:Label ID="UserNameLabel" runat="server" AssociatedControlID="UserName">Desired username:</asp:Label>
<asp:TextBox ID="UserName" runat="server"></asp:TextBox>
</div>
<div>
<asp:Label ID="PasswordLabel" runat="server" AssociatedControlID="Password">Desired password:</asp:Label>
<asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
<asp:RequiredFieldValidator ID="PasswordRequiredValidator" runat="server" ControlToValidate="Password"
Display="Dynamic" EnableClientScript="false" ValidationGroup="createUserWizard">*</asp:RequiredFieldValidator>
</div>
<div>
<asp:Label ID="ConfirmPasswordLabel" runat="server" AssociatedControlID="ConfirmPassword">Confirm password:</asp:Label>
<asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password"></asp:TextBox>
</div>
</fieldset>
<div class="errors">
<asp:ValidationSummary runat="server" ID="validationSummary"
DisplayMode="BulletList" ValidationGroup="createUserWizard"
HeaderText="<b>Please correct the following fields:</b>"
ShowMessageBox="False" ShowSummary="true" />
<asp:Literal ID="ErrorMessage" runat="server" EnableViewState="false" />
</div>
</ContentTemplate>
</asp:CreateUserWizardStep>
</WizardSteps>
</asp:CreateUserWizard>
Вот код позади (интересующие разделы):
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
createUserWizard.CreatedUser += OnUserCreated;
createUserWizard.CreateUserError += OnError;
createUserWizard.NextButtonClick += OnNextButtonClick;
}
protected void OnUserCreated(object sender, EventArgs e)
{
//Add user to group and redirect to destination page.
}
private void OnNextButtonClick(object sender, WizardNavigationEventArgs e)
{
CreateUserWizard wizard = sender as CreateUserWizard;
if (wizard.ActiveStepIndex == 0)
{
try
{
if (Membership.ValidateUser(createUserWizard.UserName, createUserWizard.Password))
{
MembershipUser newUser = Membership.CreateUser(
createUserWizard.UserName,
createUserWizard.Password);
//add user to group and redirect to destination page
}
}
catch (MembershipCreateUserException ex)
{
SetFailureMessage(ex.StatusCode);
e.Cancel = true;
}
}
}
public void SetFailureMessage(MembershipCreateStatus status)
{
switch (status)
{
case MembershipCreateStatus.DuplicateUserName:
createUserWizard.DuplicateUserNameErrorMessage = "Username is not available."; //the string is fetched from a database.
break;
case MembershipCreateStatus.InvalidPassword:
createUserWizard.InvalidPasswordErrorMessage = "Password is not secure enough"; //the string is fetched from a database.
...
}
}
private void OnError(object sender, CreateUserErrorEventArgs e)
{
if (e.CreateUserError == MembershipCreateStatus.InvalidPassword)
{
CreateUserWizard wizard = sender as CreateUserWizard;
wizard.InvalidPasswordErrorMessage = "Password is not secure enough"; //the string is fetched from a database.
...
}
}
2 ответа
ASP.NET WebForms иногда отстой. Вот решение, которое я использую для этого.
Шаг 1: Добавьте еще один элемент управления Label в верхней части страницы:
<asp:Label ID="lblErrorMessage" Text="" runat=server CssClass="failureNotification"></asp:Label>
Обратите внимание на класс CssClass.
Шаг 2: При возникновении ошибки поместите сообщение об ошибке в эту метку.
try
{
//Do stuff here
}
catch (Exception ex)
{
lblErrorMessage.Text = string.Format("An error has occurred. Please tell tech support that you saw this: <br />{0}: {1}", ex.GetType(), ex.Message);
e.Cancel = true;
}
Когда происходит ошибка, вы видите прекрасное отформатированное сообщение об ошибке. Он не находится внутри элемента управления RegisterUserWizard, но пользователь не сможет сказать. Клуджи, но это работает. ASP.NET MVC намного элегантнее.
Почему вы меняете значение, когда возникает ошибка, если вы используете только статические строки?
Свойства отображаются на панели свойств для элемента управления, если вы установите значения там все должно работать.