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
Asp.net mvc asp.net mvc数据库交互验证_Asp.net Mvc_Validation - Fatal编程技术网

Asp.net mvc asp.net mvc数据库交互验证

Asp.net mvc asp.net mvc数据库交互验证,asp.net-mvc,validation,Asp.net Mvc,Validation,在更新或添加到数据库之前,是否有人对如何连接需要与数据库交互的验证有任何链接或建议?我看到的每个示例都显示了如何验证属性,例如“是必需的”、“是电子邮件”、“是数字的”等等,但是如何连接“不能订购缺货商品”的验证?涉及到它,但没有提供一个例子 我一直在遵循使用存储库的NerdDinner教程,但这是我不太明白的一点。。。假设我们有一个带有Create方法的OrderController,在创建订单之前,我们必须首先检查商品是否有库存。在NerdDinner风格中,控制器使用存储库与数据库对话,那

在更新或添加到数据库之前,是否有人对如何连接需要与数据库交互的验证有任何链接或建议?我看到的每个示例都显示了如何验证属性,例如“是必需的”、“是电子邮件”、“是数字的”等等,但是如何连接“不能订购缺货商品”的验证?涉及到它,但没有提供一个例子

我一直在遵循使用存储库的NerdDinner教程,但这是我不太明白的一点。。。假设我们有一个带有Create方法的OrderController,在创建订单之前,我们必须首先检查商品是否有库存。在NerdDinner风格中,控制器使用存储库与数据库对话,那么我们的订单对象(模型)如何能够在属性验证的同时强制执行此验证,因为它无法与数据库对话


感谢您的帮助

我将使用方法PlaceOrder(Order-Order)创建一个OrderService。OrderService使用存储库执行CRUD操作,强制执行业务规则(库存检查),并最终在规则违反时引发异常,您可以捕获并报告给用户。

在NerdDinner教程中,您可以签出ISavaild,然后签出GetRuleViolation方法。根据您的业务和数据库规则,您可以在插入数据之前使用这些规则检查数据。您甚至可以创建一个IsValidForInsert方法来检查需要强制执行的任何特定于insert的规则

在NerdDinner中,GetRuleViolation允许您检索被违反的规则,并根据您的选择将它们冒泡到接口

    public bool IsValid
    {
        get { return (GetRuleViolations().Count() == 0); }
    }

    public IEnumerable<RuleViolation> GetRuleViolations()
    {


        if (CheckDbForViolation)
            yield return new RuleViolation("Database Violation", "SomeField");

        if (String.IsNullOrEmpty(Title))
            yield return new RuleViolation("Title is required", "Title");

        if (String.IsNullOrEmpty(Description))
            yield return new RuleViolation("Description is required", "Description");

        if (String.IsNullOrEmpty(HostedBy))
            yield return new RuleViolation("HostedBy is required", "HostedBy");

 ... etc ...


        yield break;
    }

    public bool CheckDbForViolation()

    {

    /// Do your database work here...

    }
public bool有效
{
获取{return(GetRuleViolations().Count()==0);}
}
公共IEnumerable GetRuleViolations()
{
如果(检查是否违反)
返回新的规则冲突(“数据库冲突”、“SomeField”);
if(String.IsNullOrEmpty(Title))
退回新的违规行为(“需要标题”、“标题”);
if(String.IsNullOrEmpty(Description))
退回新的违规行为(“需要说明”、“说明”);
if(String.IsNullOrEmpty(HostedBy))
收益返回新规则违规(“需要HostedBy”,“HostedBy”);
等
屈服断裂;
}
公共bool checkdbfor违规()
{
///在这里做你的数据库工作。。。
}

您可以更进一步,将数据库代码拆分到存储库中。CheckDbForViolation将调用回购以获取信息,然后确定是否存在违规。事实上,如果您正在使用存储库,我认为这将是更好的方法

关于如何做到这一点,您并不需要从示例中获得任何指导。最终,您必须能够自己创建这样的应用程序,这意味着具有创造性

我从一开始就决定不要使用内置验证或成员API,以免在某个时候遇到它的限制

对于你的情况:这几乎是标准的

设想执行流程如下所示:

  • 邮政表格
  • 验证输入数据格式,无需与数据库通信
  • 如果(2)通过,则从业务规则/数据完整性的角度验证输入。这里是数据库
  • 如果(3)通过,则执行任何操作。如果它以某种方式失败(可能数据库中的数据完整性规则禁止该操作,例如,您从另一个浏览器窗口中删除了相关对象),则取消该操作并通知用户操作错误
  • 尽量保持控制器方法为空。验证和操作逻辑应该驻留在您的模型和业务逻辑中。控制器基本上应该尝试一个预期的操作,并根据返回的状态只返回一个视图或另一个视图。也许还有一些选择,但不是检查用户角色、访问权限、调用某些web服务等的全部内容。保持简单


    另一方面,我有时会觉得,对于大多数开发人员来说,旨在简化简单事情的内置功能往往会在已移除的功能基础上制造新的障碍。

    我希望在NerdDinner上保留这一点,目前不使用服务。我想让事情尽可能简单,让我的头脑了解它是如何连接起来的。谢谢,我已经读过关于IsValid和GetRuleViolations的内容,但并没有提到“不能订购缺货商品”的场景。这种类型的业务规则放在哪里?感谢您的验证步骤之一是出去查询数据库,看看商品是否有库存。然后,如果你是好的或者失败的话,继续,并防止数据库写入的发生。我知道验证步骤是什么,但是逻辑会走到哪里呢?控制器使用存储库,因此要查询数据库,此逻辑需要在控制器中,但是,我的理解是,业务规则应该保留在模型中?我开始觉得控制器不应该使用存储库?!谢天谢地,我还没弄清楚。。。如果进入Models/dinner.cs文件,您将添加验证代码,该代码作为GetRuleViolations方法中的方法调用查看数据库。我将它作为一个方法调用,只是为了保持GetRuleViolations方法漂亮、干净并且易于解释。这是否更清楚?您列出的执行流程正是我要做的,我只是不确定NerdDinner示例中的验证将放在哪里。如果Order对象使用存储库,然后控制器单独与Order对象对话,那么对我来说更有意义。通过这种方式,Order对象可以处理两种形式的验证asit现在可以与数据库进行通信,您认为这是更好的选择吗?谢谢我对NerdDinner的例子不太熟悉。如果“Repository”表示