有没有办法验证模型上应该是唯一的属性?例如,用户可以创建和编辑“产品”,但他们不应该能够使用现有的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上找到了其他主题,但没有一个可靠的解决方案。
答案 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的“不等于” - 这样就可以检查产品代码是否存在但不是当前产品。