MVC 2唯一索引验证

时间:2010-12-15 13:25:47

标签: c# asp.net-mvc-2 unique-index

有没有办法验证模型上应该是唯一的属性?例如,用户可以创建和编辑“产品”,但他们不应该能够使用现有的ProductCode创建产品,也不能编辑产品并将ProductCode更改为已存在的代码。

我尝试过使用自定义属性。

public class Unique : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        var products = Repository.Store.Products.Where(x => x.ProductCode == value);
        return (products.Count() == 0);
    }
}

我可以用此解决方案覆盖的所有内容都不允许用户在代码已存在于DB中时插入/更新产品。这不允许用户编辑现有产品,因为当他们提交时,会看到代码已经存在(它将是他们试图编辑的产品的代码。)并返回false。

有没有办法处理MVC 2中的唯一索引,我已经搜索了几个小时,甚至在stackoverflow上找到了其他主题,但没有一个可靠的解决方案。

3 个答案:

答案 0 :(得分:3)

只是让插入或更新失败,然后向用户返回相应的错误消息。无论如何,检查前面是有问题的,因为另一个用户总是有可能在您检查后立即修改数据库。

以下是一个示例,说明如何插入对象并确定它是否因唯一约束而失败:

INSERT INTO MyTable (column1, column2, column3) 
    SELECT @param1, @param2, @param3
    WHERE NOT EXISTS (SELECT * FROM table WHERE id = @param4)

如果对象已存在,则将修改0行。如果没有,那么它将修改1行。如果出现其他任何问题,您将获得例外。这也非常有效(至少在SQL服务器中)。它会导致索引搜索,然后是索引更新,就像您希望的那样。

答案 1 :(得分:0)

我在相关领域与MVC争吵了一段时间。

我的问题所回答的部分答案是你应该“可能”为一个对象的插入和更新提供一个单独的模型。

通过这种方式,您可以在插入模型上使用自定义属性。

否则,只需在插入方法中将其作为常规代码检查,而不是在自定义属性中。

答案 2 :(得分:0)

好的,我明白了....

您是否可以检查对象上存在的某些唯一ID的“不等于” - 这样就可以检查产品代码是否存在但不是当前产品。