C# asp.NET MVC实体验证依赖于相同类型的其他实体

C# asp.NET MVC实体验证依赖于相同类型的其他实体,c#,asp.net,asp.net-mvc,validation,model,C#,Asp.net,Asp.net Mvc,Validation,Model,我有一个模型描述如下: public class Projet { public int ProjetId { get; set; } public int SeqNumber{ get; set; } public string Code{ get; set; } public string Description { get; set; } public bool Std{ get; set; } public bool Ar

我有一个模型描述如下:

    public class Projet
    {
    public int ProjetId { get; set; }

    public int SeqNumber{ get; set; }
    public string Code{ get; set; }
    public string Description { get; set; }
    public bool Std{ get; set; }
    public bool Archive { get; set; }
    }
我有一个create视图,允许用户创建一个新项目,我必须释放SeqNumber字段,以便用户可以输入他想要的任何数字。 但是,如果SeqNumber choosen已经被使用,我必须返回一个错误

我不知道如何实现这一点。我应该在ProjetController/Create操作中进行一些验证吗?从我发现的情况来看,验证控制器中的东西是一种糟糕的做法,但是当验证依赖于同一类的其他成员时,我想不出在哪里实现验证。 为MVC编写自定义验证器会被认为是一个好的实践吗


谢谢

您可以在处理表单提交的http post操作方法中使用它

[HttpPost]
public ActionResult Create(Projet model)
{
   var exist = db.Projects.Any(s=>s.SeqNumber===model.SeqNumber 
                                && s.ProjectId!=model.ProjectId);
   if(exist)
   {
     ModelState.AddModelError(string.empty,"Sequence number is already in use");
    return View(model);
   }
   // to do : Continue with your save
}
现在,当用户提交表单时,如果序列号用于任何其他项目,它将抛出一条验证消息。确保在视图中使用验证摘要帮助器来呈现验证错误消息

@model Project
@Html.ValidationSummary(false)
@using(Html.BeginForm())
{
   <!-- your existing code goes here-->
} 
现在确保您有一个名为
CheckSeqNumber
的操作方法,它以json响应的形式返回true或false

public ActionResult CheckTagName(int SeqNumber)
{
  var exist= !db.Projects.Any(g => g.SeqNumber == SeqNumber);
  return Json(exist,JsonRequestBehavior.AllowGet);
}
还要确保您已经加载了相关的javascript文件来进行这种不引人注目的验证

<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>


另一个选项是编写一个自定义验证属性,该属性为您执行此检查(如果您不喜欢action方法中的该检查)。是一篇解释如何进行远程验证的SO帖子。

我想您正在寻找远程验证的良好开端:在创建操作中验证值没有什么错。事实上,根据字段的语义,这可能是一个业务规则,在这种情况下,它应该在后端进行验证。也就是说,您总是可以使用一些JS编写自己的验证方案,并在后端启动一个方法(比如web服务或其他东西),以查看该值是否存在。不过我还是建议在后端做。非常好的解释,谢谢。这应该能让我走了。
<script src="~/Scripts/jquery.validate.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.js"></script>