1

ユーザーの管理、ログイン/ログアウトなどのために、認証サービスを備えた Silverlight 4.0 ナビゲーション アプリケーションを作成しています。

このページの msdn チュートリアルを使用しました: http://msdn.microsoft.com/en-us/library/ee942451%28v=vs.91%29.aspx

それはうまくいきます。いくつかのカスタム プロファイル プロパティを使用してユーザーを作成し、ログインおよびログアウトできます。

問題は私のユーザー作成フォームです。チュートリアルのように、サービス プロジェクトで、データ注釈を使用して NewUser というクラスを作成しました。無効なフィールドでユーザーを作成しようとすると、作成が失敗し、検証エラーがあるというメッセージで例外が発生するように、これらは機能しているようです。

この検証をフォームで機能させたいと思います。他のフォームでは、クラスのインスタンスをフォームにバインドし、各フィールドのバインディングを validationOnException を true に、notifyOnValidationError を true に設定するだけです。

他のフォームと同様にユーザー作成フォームでバインドを作成しましたが、機能していないようです。NewUser クラスの一連のプロパティにブレークポイントを設定しようとしました。まったく呼び出されたり使用されたりしないようです。

これはおそらく私が何かを見逃しているという単純な問題ですが、何がわからないのですか。NewUser クラスが私のサービス プロジェクトにあり、フォームがクライアント プロジェクトにあるという事実と関係がありますか。皆さんが私を助けてくれることを願っています。

NewUser クラスの私のコード

public class NewUser 
{

    private string username;

    [Key]
    [Required()]
    public string UserName { get; set; }

    [Key]
    [Required()]
    [RegularExpression(@"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage="Invalid email. An email must use the format username@mycompany.com")]
    public string Email { get; set; }


    [Required()]
    public string Firstname { get; set; }

    [Required()]
    public string Lastname { get; set; }

    [Required()]
    public DateTime Birthsday { get; set; }

    [Required()]
    public bool SentNewsletter { get; set; }

    [Required()]
    public bool SentReminders { get; set; }



    [Required()]
    public string Password { get; set; }

    [CustomValidation(typeof(RegistrationValidator), "IsPasswordConfirmed")]        
    public string ConfirmPassword { get; set; }

    [Required()]
    public string SecurityQuestion { get; set; }

    [Required()]
    public string SecurityAnswer { get; set; }

}

私の作成ユーザーフォームxaml

<navigation:Page x:Class="OenskePortalen.Views.Pages.CreateNewUser" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       mc:Ignorable="d"
       xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
       xmlns:input="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"                 
       xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
       xmlns:uc="clr-namespace:OenskePortalen.Views.Controls"
       d:DesignWidth="640" d:DesignHeight="680"
       Title="CreateNewUser Page">
<Grid x:Name="LayoutRoot" Background="White">
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="40"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="180"/>
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="160"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <uc:InfoBox Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="4" DisplayText="Her kan du oprette dig som bruger på ØnskePortalen" VerticalAlignment="Top"/>

    <TextBlock Grid.Row="1" Grid.Column="0" Text="Brugernavn" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="1" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <TextBox Grid.Row="1" Grid.Column="2" x:Name="txtUsername" Text="{Binding UserName, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5"  HorizontalAlignment="Left"  />

    <TextBlock Grid.Row="2" Grid.Column="0" Text="Fornavn" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="2" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <TextBox Grid.Row="2" Grid.Column="2" x:Name="txtFirstname" Text="{Binding Firstname, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" HorizontalAlignment="Left"  />

    <TextBlock Grid.Row="3" Grid.Column="0" Text="Efternavn" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="3" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <TextBox Grid.Row="3" Grid.Column="2" x:Name="txtLastname"  Text="{Binding Lastname, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" HorizontalAlignment="Left" />

    <TextBlock Grid.Row="4" Grid.Column="0" Text="Email" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="4" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <TextBox Grid.Row="4" Grid.Column="2" x:Name="txtEmail" Text="{Binding Email, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" HorizontalAlignment="Left" />

    <TextBlock Grid.Row="5" Grid.Column="0" Text="Adgangskode" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="5" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <PasswordBox Grid.Row="5" Grid.Column="2" x:Name="txtPassword" Password="{Binding Password, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" />

    <TextBlock Grid.Row="6" Grid.Column="0" Text="Gentag adgangskode" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="6" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <PasswordBox Grid.Row="6" Grid.Column="2" x:Name="txtPasswordRepeat" Password="{Binding PasswordConfirm, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" />

    <TextBlock Grid.Row="7" Grid.Column="0" Text="Sikkerhedsspørgsmål" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="7" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <TextBox Grid.Row="7" Grid.Column="2" x:Name="txtPasswordQuestion" Text="{Binding SecurityQuestion, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" HorizontalAlignment="Left" />

    <TextBlock Grid.Row="8" Grid.Column="0" Text="Sikkerhedssvar" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="8" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <TextBox Grid.Row="8" Grid.Column="2" x:Name="txtPasswordAnswer" Text="{Binding SecurityAnswer, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Width="150" Margin="5" HorizontalAlignment="Left" />

    <TextBlock Grid.Row="9" Grid.Column="0" Text="Fødselsdag" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="9" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <sdk:DatePicker Grid.Row="9" Grid.Column="2" x:Name="dpBirthsday" SelectedDate="{Binding Birthsday, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}"  VerticalAlignment="Center" Width="150" Margin="5" HorizontalAlignment="Left"/>

    <TextBlock Grid.Row="10" Grid.Column="0" Text="Nyhedsbrev" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="10" Grid.Column="1" Text=":" VerticalAlignment="Center"/>
    <CheckBox Grid.Row="10" Grid.Column="2" x:Name="cboxNewsletter" IsChecked="{Binding SentNewsletter, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Margin="5"/>

    <TextBlock Grid.Row="11" Grid.Column="0" Text="Påmindelser om fødselsdage" VerticalAlignment="Center"/>
    <TextBlock Grid.Row="11" Grid.Column="1" Text=":" VerticalAlignment="Center" />
    <CheckBox Grid.Row="11" Grid.Column="2" x:Name="cboxReminders" IsChecked="{Binding SentReminders, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" VerticalAlignment="Center" Margin="5"/>



    <StackPanel Grid.Row="12" Grid.Column="0" Grid.ColumnSpan="3" HorizontalAlignment="Right" Orientation="Horizontal" >

        <Button x:Name="btnCreate" Style="{StaticResource GreenButton}" Background="{StaticResource GreenGradientBrush}" Height="20" Margin="5" Click="btnCreate_Click" Cursor="Hand" >
            <TextBlock Text="Opret ny bruger" Style="{StaticResource textStyleBlack}" />
        </Button>

        <Button x:Name="btnCancel" Style="{StaticResource BlueButton}" Background="{StaticResource BlueGradientBrush}" Height="20" Margin="5"  Click="btnCancel_Click" Cursor="Hand" >
            <TextBlock Text="Annuller" Style="{StaticResource textStyleBlack}" />
        </Button>
    </StackPanel>

    <input:ValidationSummary Grid.Row="13" Grid.Column="0" Grid.ColumnSpan="3" />

</Grid>

そして、私の作成ユーザーフォームコードビハインド

public partial class CreateNewUser : Page
{
    private NewUser user;

    public CreateNewUser()
    {
        InitializeComponent();
        user = new NewUser();
        LayoutRoot.DataContext = user;
        dpBirthsday.SelectedDate = DateTime.Now;
        cboxNewsletter.IsChecked = true;
        cboxReminders.IsChecked = true;
    }

    private void btnCreate_Click(object sender, RoutedEventArgs e)
    {
        updateValidation();

        if (!Validation.GetHasError(LayoutRoot))
        {

            RegistrationDomainContext context = new RegistrationDomainContext();
            NewUser user = new NewUser();
            try
            {
                user.UserName = txtUsername.Text;
                user.Password = txtPassword.Password;
                user.Email = txtEmail.Text;
                user.ConfirmPassword = txtPassword.Password;
                user.SecurityQuestion = txtPasswordQuestion.Text;
                user.SecurityAnswer = txtPasswordAnswer.Text;
                user.Firstname = txtFirstname.Text;
                user.Lastname = txtLastname.Text;
                user.Birthsday = dpBirthsday.SelectedDate.GetValueOrDefault(DateTime.Now);
                user.SentNewsletter = cboxNewsletter.IsChecked.GetValueOrDefault(true);
                user.SentReminders = cboxReminders.IsChecked.GetValueOrDefault(true);

                context.NewUsers.Add(user);
                context.SubmitChanges(RegisterUser_Completed, null);
            }
            catch (Exception exc)
            {
                ErrorWindow w = new ErrorWindow(exc);
                w.Show();
            }


        } // end validation


    }


    private void RegisterUser_Completed(SubmitOperation so)
    {
        if (so.HasError)
        {

            ErrorWindow ew = new ErrorWindow(so.Error);
            ew.Show();
            so.MarkErrorAsHandled();
        }
        else
        {
            LoginParameters lp = new LoginParameters(txtUsername.Text, txtPassword.Password);
        }
    }


    private void btnCancel_Click(object sender, RoutedEventArgs e)
    {
        MainPage mp = Application.Current.RootVisual as MainPage;
        mp.contentFrame.Navigate(new Uri("/home", UriKind.Relative));
    }


    private void updateValidation()
    {
        foreach (var current in LayoutRoot.Children)
        {
            if (current is TextBox)
                (current as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();

            if (current is PasswordBox)
                (current as PasswordBox).GetBindingExpression(PasswordBox.PasswordProperty).UpdateSource();
        }
    }
}
4

1 に答える 1

0

プライベート フィールドにデータ バインドできないと思いuserます。コード ビハインドをパブリック プロパティに変更してみてください (INotifyPropertyChanged の実装を参照してください)。

于 2012-12-10T02:57:37.713 に答える