c# - 使用 ViewModel 进行验证

标签 c# asp.net-mvc entity-framework ado.net

我有一个带有 ado.net Entity Framework 的 asp.net mvc3 做一些验证。

我已经创建了一个 View 模型

public class id
{


    [Required]
    public decimal l_ID
    {
        get;
        set;
    }

    [Required]
    public decimal v_ID
    {
        get;
        set;
    }
}

是否可以添加一些验证规则,使 l_id 必须大于 v_id?一旦用户提交了页面,就应该进行验证。这将如何完成?任何教程?是否需要在 Controller 中或使用部分类来完成此验证?有例子吗

最佳答案

我一直在使用 IValidatable 接口(interface),与自定义属性验证相比,它相当简单。这是代码:

public class id : IValidatableObject
    {
        [Required]
        public decimal l_ID { get; set; }

        [Required]
        public decimal v_ID { get; set; }

        private bool _hasBeenValidated = false;

        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {

            if (!_hasBeenValidated)
            {
                // validation rules go here. 
                if (l_ID <= v_ID)
                    yield return new ValidationResult("Bad thing!", new string[] { "l_ID" });
            }

            _hasBeenValidated = true;
        }
    }

请注意,当从将 ViewModel 作为参数的 POST 操作发生绑定(bind)时,将自动调用 Validate 方法,因此您无需对事件进行任何连接。 bool _hasBeenValidated 的东西在那里是因为现在 MVC3 中有一个准错误(恕我直言)在某些情况下调用该验证方法两次(比如当这个 ViewModel 也被用作另一个 ViewModel 并发布)

ValidationResult 构造函数的第二个参数是验证绑定(bind)到的属性的名称,因此在这种情况下, View 中 l_ID 的 ValidatorFor 标记会在其中收到“坏事”消息。

关于c# - 使用 ViewModel 进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825200/

相关文章:

c# - 在 ExecuteStoreQuery 错误消息 : "Value does not fall within the expected range." 中使用 OracleParameter

c# - 如何强制winCE启动后看到SD/MMC卡

c# - 为什么当文件变大时我的内存就会耗尽?

c# - 在 IQueryable 结果中获取索引

asp.net-mvc - 如何在Asp.net Core中将缓存更新为并发请求?

c# - Entity Framework : Duplicate Records in Many-to-Many relationship

c# - 用于跨平台 GUI 开发的最佳技术是什么?

c# - 无法加载文件或程序集 'System.Web.Mvc, Version=3.0.0.0' 或其依赖项之一

asp.net-mvc - 缓存的最佳解决方案

c# - 使用 EF 中的通用方法检查数据库中是否存在记录