asp.net mvc数据库交互验证

时间:2009-05-16 21:29:11

标签: asp.net-mvc validation

在更新或添加到数据库之前,是否有任何关于如何连接需要与数据库交互的验证的链接或建议?我看到的每个示例都显示了如何验证属性,例“是必需的”,“是电子邮件”,“是数字”等,但是如何连接“无法订购缺货商品”的验证? This xVal blog post触及它,但没有提供示例。

我一直在关注使用存储库的NerdDinner教程,但这是我不太理解的...说我们有一个带有Create方法的OrderController,在创建订单之前我们必须首先检查该商品有货。在NerdDinner样式中, Controller使用存储库与数据库通信,因此我们的Order对象(Model)如何能够与属性验证一起强制执行此验证,因为它无法与之交谈数据库?

感谢您的帮助

3 个答案:

答案 0 :(得分:3)

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

在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...

    }

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

答案 1 :(得分:1)

您并不需要有关如何执行此操作的示例的任何指导。最终,您必须能够自己创建这样的应用程序,这意味着要有创意。

我从一开始就决定不使用内置验证或成员资格API,以免在某些时候遇到其限制。

根据您的情况:它非常标准。

想象一下执行流程如下:

  1. 发表表格
  2. 在不与数据库通信的情况下验证输入数据格式
  3. 如果(2)通过,则从业务规则/数据完整性验证输入。在这里您可以与数据库交谈
  4. 如果(3)通过,则执行您的操作,无论它是什么。如果它以某种方式失败(可能数据库中的数据完整性规则禁止操作,比如,您从其他浏览器窗口删除了相关对象),则取消它并通知用户操作错误。
  5. 尽量将控制器方法保持为空。验证和操作逻辑应该驻留在您的模型和业务逻辑中。控制器基本上应该尝试一个预期的操作,并根据返回的状态返回一个视图或另一个视图。可能还有一些选项,但不是用户角色,访问权限,调用某些Web服务等的全部检查。保持简单。

    P.S。我有时会觉得内置功能旨在简化大多数开发人员的简单操作,这往往会为删除的内容创造新的障碍。

答案 2 :(得分:0)

我将使用方法PlaceOrder(订单顺序)创建OrderService。 OrderService使用存储库来执行CRUD操作并强制执行业务规则(库存检查),并最终抛出违反规则的异常,您可以捕获并向用户报告。