Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC-验证-ViewModel是否可以访问数据库_C#_Asp.net Mvc_Validation_Asp.net Mvc 4 - Fatal编程技术网

C# MVC-验证-ViewModel是否可以访问数据库

C# MVC-验证-ViewModel是否可以访问数据库,c#,asp.net-mvc,validation,asp.net-mvc-4,C#,Asp.net Mvc,Validation,Asp.net Mvc 4,我有一个视图模型,它应该检查一个新实体的标签是否唯一,而不是在DB中 目前,我已经在视图模型类中完成了: public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { if (PowerOrDuty != null) { if (PowerOrDuty.Identifier == null)

我有一个视图模型,它应该检查一个新实体的标签是否唯一,而不是在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");
                    }
                }                    
            }
           ......
请注意,这是一个小的内部应用程序与小数据库和我的时间是有限的,所以代码不是完美的


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

我认为从VM访问DB没有错。。。AFAIK并没有打破MVC概念,因为它是一个表示层概念。也就是说,如果您拥有由服务层提供的验证方法,效果会更好


但是所有与ViewModel内容相关的逻辑,都保存在VM中比保存在控制器中更好。更干净的控制器更好。

我个人喜欢ViewModels是贫血型的,只不过是带有属性的类

对于像这样的定制服务器端验证,我更喜欢在服务中进行,在控制器中使用服务,甚至在定制验证器后面

使用自定义验证器,您甚至可以选择远程执行验证。虽然这会变得有点复杂,但我使用了一个通用的远程验证程序来完成,它使用一个Ajax操作方法来执行验证,并通过客户端验证程序和远程验证程序将其连接起来,以确保在单个方法中具有验证逻辑

但无论你走哪条路,我认为将所有逻辑排除在ViewModel之外更为常见,而且在我看来也更为清晰。即使是在一个简单的应用程序中,您的ViewModel对于您的数据库上下文也应该是哑的。理想情况下,只有服务(不一定是web服务)才知道您的数据库上下文,而只是一个抽象层


对我来说,无论应用程序的大小,都应该这样做。我认为,它只会为您的解决方案添加另一个程序集所付出的努力和复杂性值得您进行抽象。接下来,如果您决定从另一个应用程序中使用您的服务,或者如果您决定交换数据库上下文,那么在适当的位置进行抽象就容易多了。

您的视图模型不应该绑定到上下文,它只关心在提交后显示数据和验证数据。您可以执行验证,如必填字段或范围中的值,但无法知道数据库中是否已存在标签

您也不能在显示表单之前获取禁止标签列表,以便在之后测试标签,因为在此期间,该列表可能已更改,而其他用户正在更新您的数据库

在我看来,模型级别的验证应该关注在不知道数据源的情况下可以验证的内容,并让您的数据库通知您错误,例如在具有唯一约束的字段中提交重复值。您将捕获来自数据库的类似错误的异常,并相应地管理它们

无论如何,我认为对于这样的问题没有直接的答案

视图模型应该具有直接数据库访问权限吗

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

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

这与ViewModel无关。 这将在ViewModel的测试中引入一些复杂性,几乎不需要任何测试。我想这是麻烦来临的迹象

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

也许,如果DB指的是存储库。但我想到的是一个单独的自定义验证类,您可以在另一个控制器中拔出、测试和重用该类,以进行ajax验证,等等