• Silverlight+RIA Service Required验证失效问题的解决方案


    Silverlight+RIA Service Required验证失效问题的解决方案

    Silverlight+RIA Service当我们给一个Model添加[Required]特性的时候,想必一定是要在内容Save之前进行不能为空的验证。

    但是这个验证是基于PropertyChanged的,如果我们不修改内容,而直接提交窗口内容,那么由于没有产生PropertyChanged,所以原先的验证就不会被执行。

    示例窗口:


    代码
     1 <UserControl x:Class="SilverlightTest.MainPage"
     2     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6     xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input"
     7     mc:Ignorable="d"
     8     d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded">
     9 
    10     <Grid x:Name="LayoutRoot" Background="White">
    11         <StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
    12             <dataInput:ValidationSummary x:Name="vs" Visibility="Visible"></dataInput:ValidationSummary>
    13             <StackPanel Orientation="Horizontal" Margin="5">
    14                 <TextBlock Text="User Name" Width="100"></TextBlock>
    15                 <TextBox x:Name="tbUserName" Width="150" Text="{Binding UserName, Mode=TwoWay, ValidatesOnExceptions=true, NotifyOnValidationError=true}"></TextBox>
    16             </StackPanel>
    17             <StackPanel Orientation="Horizontal" Margin="5">
    18                 <TextBlock Text="User Address" Width="100"></TextBlock>
    19                 <TextBox x:Name="tbUserAddress" Text="{Binding UserAddress,Mode=TwoWay}" Width="150"></TextBox>
    20             </StackPanel>
    21             <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
    22                 <Button x:Name="btSave" Content="Save" Width="80" Margin="5" Click="btSave_Click"></Button>
    23                 <Button x:Name="btCancel" Content="Cancel" Width="80" Margin="5"></Button>
    24             </StackPanel>
    25         </StackPanel>
    26     </Grid>
    27 </UserControl>
    28 
    29 

     下面我们来看一下代码

    Model

    代码
     1     public class MyUser
     2     {
     3         [Key]
     4         public int UserID { getset; }
     5 
     6         [Required(ErrorMessage = "User name is required")]
     7         public string UserName { getset; }
     8 
     9         public string UserAddress { getset; }
    10     }

    Web.g.cs文件生成的代码如下:

    代码
     1         /// <summary>
     2         /// Gets or sets the 'UserName' value.
     3         /// </summary>
     4         [DataMember()]
     5         [Required(ErrorMessage="User name is required")]
     6         public string UserName
     7         {
     8             get
     9             {
    10                 return this._userName;
    11             }
    12             set
    13             {
    14                 if ((this._userName != value))
    15                 {
    16                     this.OnUserNameChanging(value);
    17                     this.RaiseDataMemberChanging("UserName");
    18                     this.ValidateProperty("UserName", value);
    19                     this._userName = value;
    20                     this.RaiseDataMemberChanged("UserName");
    21                     this.OnUserNameChanged();
    22                 }
    23             }
    24         }

    由上述代码我们可以看到验证是依赖于UserName属性值改变时,才被执行。

    那么问题来了,如果使用 者一上来,什么数据都不填,直接点击Save按钮,那么验证代码将得不到 执行,下面我们来解决这个问题:


    代码
    1         private void btSave_Click(object sender, RoutedEventArgs e)
    2         {
    3             tbUserName.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    4 
    5             if (vs.Errors.Count == 0)
    6             {
    7                 //TODO:SAVE
    8             }
    9         }

    如上红色代码所示,使用这行代码手工验证,可以解决上述问题。

     运行结果

     

  • 相关阅读:
    C#去掉数组中重复的字符串 .Distinct()
    文件上传 uploadlabs
    Sipdroid初尝
    腾讯面试小记
    C/C++拾遗(二)
    ZigBee简介
    大端小端
    字符串——算法系列
    重复定义
    C/C++拾遗
  • 原文地址:https://www.cnblogs.com/zhb/p/1749734.html
Copyright © 2020-2023  润新知