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>