MVC - 验证 - ViewModel应该可以访问DB

Max*_*eev 6 c# validation asp.net-mvc asp.net-mvc-4

我有一个视图模型,应检查新实体的标签是否唯一(不在DB中).

目前我在视图模型类中完成了它:

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (PowerOrDuty != null)
        {
            if (PowerOrDuty.Identifier == null)
            {
                using (var db = new PowersAndDutiesContext()) 
                {
                    var existingLabels = db.PowersAndDuties.Select(pod => pod.Label);
                    if (existingLabels.Contains(PowerOrDuty.Label))
                    {
                        yield return new ValidationResult("Cannot create a new power or duty because another power or duty with this label already exists");
                    }
                }                    
            }
           ......
Run Code Online (Sandbox Code Playgroud)

请注意,这是一个小型内部应用程序,小数据库,我的时间有限,所以代码并不完美.

我觉得从视图模型访问数据库可能是一种不好的做法.视图模型是否应该直接访问数据库?它应该能够调用存储库来获取可用的标签吗?是否应该在控制器中进行需要DB访问的验证?

jbl*_*jbl 6

视图模型是否应该直接访问数据库?

我认为应该不惜一切代价避免这种情况

它应该能够调用存储库来获取可用的标签吗?

这不是ViewModel的关注点.这会在ViewModel的测试中引入一些复杂性(几乎不需要),我想这是一个麻烦来的迹象.

是否应该在控制器中进行需要DB访问的验证?

也许,如果用"DB"表示"存储库".但是我想到的是一个单独的自定义验证类,您可以(在其他控制器中进行插件,测试和重用)进行ajax验证等.