MVC——ViewModel的数据验证

本文介绍了在MVC框架中如何使用ViewModel进行数据验证,包括正则表达式验证、必填项验证和长度限制。在ViewModel中定义了数据属性并添加了验证特性,如[Required]、[StringLength]和[RegularExpression]。在View中引用ViewModel并利用@Html.ValidationMessageFor显示验证错误信息。同时,文章还提到了需要引用的JS文件(JQuery、Validate、unobtrusive-ajax和unobtrusive)的顺序,以及控制器中检查模型状态的方法来确保服务器端验证的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 编写目标ViewModel

  2. 引用命名空间

  3. using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
  4. 编写相应的验证

  5.         public int ID { get; set; }
    
            [Display(Name="用户名")]
            [Required(ErrorMessage="请填写{0}")]
            [StringLength(4,ErrorMessage="只能输入4位数的{0}")]
            [RegularExpression("^[\u4e00-\u9fa5]+$", ErrorMessage = "{0}必须为中文")]
            public string Names { get; set; }
  6. View中引用对应的ViewModel

  7. @model BaWei9U6R.UserInfoSubmit.MVC_Client.Models.UserVIewModel
  8. 使用验证控件(用于显示验证消息)

  9.     <div id="body">我在想什么?<br /></div>
          <div class&#
### WPF MES 系统中的数据验证实现 在构建基于 Windows Presentation Foundation (WPF) 的制造执行系统 (MES) 时,数据验证是一个至关重要的部分。它不仅确保输入的数据符合业务逻辑的要求,还能够提升用户体验并减少潜在错误的发生。 #### 数据验证的核心概念 WPF 提供了一种强大的机制来处理数据验证——通过绑定引擎和 `IDataErrorInfo` 或者 `INotifyDataErrorInfo` 接口[^2]。这些接口允许开发者定义自定义的验证逻辑,并将其集成到视图模型中。这种设计遵循 Model-View-ViewModel (MVVM) 架构模式,从而保持代码的清晰性和可维护性。 以下是具体实现方法: --- #### 使用 IDataErrorInfo 实现基本验证 `IDataErrorInfo` 是一种简而有效的验证方式,适用于大多数场景。其实现如下所示: ```csharp public class MesModel : INotifyPropertyChanged, IDataErrorInfo { private string _productName; public string ProductName { get => _productName; set { if (_productName != value) { _productName = value; OnPropertyChanged(nameof(ProductName)); } } } public string Error => null; // 不常用的整体错误信息 public string this[string columnName] { get { switch (columnName) { case nameof(ProductName): if (string.IsNullOrWhiteSpace(_productName)) return "产品名称不能为空"; break; } return null; // 验证成功返回 null } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 上述代码展示了如何针对特定属性(如 `ProductName`)实施简的非空校验[^3]。 --- #### 使用 INotifyDataErrorInfo 支持异步或多条件验证 对于更复杂的场景,例如需要网络请求或其他耗时操作完成验证的情况,则可以采用 `INotifyDataErrorInfo` 接口。该接口支持多条错误消息以及动态更新的能力。 下面是一段示例代码: ```csharp public class AdvancedMesModel : INotifyPropertyChanged, INotifyDataErrorInfo { private readonly Dictionary<string, List<string>> _errorsByPropertyName = new Dictionary<string, List<string>>(); private string _batchNumber; public string BatchNumber { get => _batchNumber; set { if (_batchNumber != value) { _batchNumber = value; ValidateBatchNumber(); OnPropertyChanged(nameof(BatchNumber)); } } } public bool HasErrors => _errorsByPropertyName.Any(kvp => kvp.Value.Count > 0); public IEnumerable GetErrors(string propertyName) { if (string.IsNullOrEmpty(propertyName) || !_errorsByPropertyName.ContainsKey(propertyName)) return null; return _errorsByPropertyName[propertyName]; } private void ValidateBatchNumber() { ClearErrors(nameof(BatchNumber)); if (string.IsNullOrWhiteSpace(_batchNumber)) { AddError(nameof(BatchNumber), "批次号不能为空"); } else if (!_batchNumber.All(char.IsDigit)) // 假设只接受数字作为有效输入 { AddError(nameof(BatchNumber), "批次号应仅包含数字字符"); } } private void AddError(string propertyName, string error) { if (!_errorsByPropertyName.ContainsKey(propertyName)) _errorsByPropertyName[propertyName] = new List<string>(); _errorsByPropertyName[propertyName].Add(error); RaiseErrorsChanged(propertyName); } private void ClearErrors(string propertyName) { if (_errorsByPropertyName.ContainsKey(propertyName)) { _errorsByPropertyName[propertyName].Clear(); RaiseErrorsChanged(propertyName); } } private void RaiseErrorsChanged(string propertyName) { ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName)); } public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 此代码片段实现了更为灵活的验证逻辑,包括批量清除错误、添加新错误等功能[^4]。 --- #### 将验证结果反馈至 UI 层 为了使用户界面实时反映验证状态,在 XAML 中可以通过设置 `Validation.ErrorTemplate` 和绑定 `Binding.ValidatesOnDataErrors=True` 来展示错误提示信息。例如: ```xml <TextBox> <TextBox.Text> <Binding Path="BatchNumber" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True"> <Binding.ValidationRules> <!-- 可选:额外增加其他规则 --> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> <!-- 自定义错误模板 --> <Control.Template> <ControlTemplate> <DockPanel LastChildFill="True"> <TextBlock DockPanel.Dock="Bottom" Foreground="Red" FontSize="10" Text="{Binding ElementName=textBox, Path=(Validation.Errors)[0].ErrorContent}" /> <Border BorderBrush="Red" BorderThickness="1"> <AdornedElementPlaceholder Name="adorner"/> </Border> </DockPanel> </ControlTemplate> </Control.Template> ``` 以上配置会自动显示红色边框及下方的文字说明当发生验证失败时[^5]。 --- #### 总结建议 尽管 ASP.NET MVC 更倾向于将验证置于模型层[^1],但在 WPF 应用程序开发过程中推荐利用 MVVM 结合 `IDataErrorInfo` 或 `INotifyDataErrorInfo` 进行前端层面的初步过滤;同时后台服务端仍需重复检查提交过来的信息以防遗漏任何可能的安全隐患或非法参数传递情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值