我有一个表单,用户可以在其中创建Project
,模型在[HttpPost]
上验证就好了。
我Create
行动的以下验证是我目前使用的:
if (ModelState.IsValid)
{
var alreadyExists = db.Projects.FirstOrDefault(p => p.Name == project.Name) ?? db.Projects.FirstOrDefault(p => p.ID== project.ID);
if (alreadyExists != null) // If a project with the same name exists
{
return View(project);
}
db.Projects.Add(project);
db.SaveChanges();
return View(project);
}
目前,如果项目Name
或ID
已经存在,它只返回包含来自Entity Framework的值的行,而不向用户发送通知。我想创建某种形式的警报,告诉用户在POST 之后,他们尝试创建的项目已经存在。
我写了PartialView
并将代码放在_Create.cshtml
:
<div class="alert alert-danger">
<strong>Error!</strong> A project with that name or ID already exists!
</div>
以下位于Create.cshtml
的表单顶部:
@Html.Partial("_Create", Model)
并更新了我的Create
控制器以返回PartialView
:
var alreadyExists = db.Projects.FirstOrDefault(p => p.Name == project.Name) ?? db.Projects.FirstOrDefault(p => p.TAF == project.TAF);
if (alreadyExists != null) // If a project with the same name exists
{
return PartialView(project);
}
但是,即使在将表单发布到控制器之前,始终会显示引导警报。
如果EF数据库已包含具有相同属性的记录,如何仅在POST后显示警报?
答案 0 :(得分:2)
您可以在POST方法中传递ViewBag
属性以指示是否存在错误,例如ViewBag.Error = true;
,然后在视图中测试它是否存在
@if(ViewBag.HasError != null)
{
@Html.Partial("_Create", Model)
}
Howevere,MVC已经内置了此功能。在POST方法中,您可以添加ModelState
错误
if (alreadyExists != null)
{
ModelState.AddModelError("", "your error message");
}
该消息将显示在视图中的@Html.ValidationSummary()
占位符中。
请注意,如果您希望与特定媒体资源相关联的邮件,则可以使用ModelState.AddModelError("YourPropertyName", "your error message");
,它会显示在@Html.ValidationMessageFor(m => m.YOurPropertyName)
您还可以考虑使用RemoteAttribute
为您提供客户端验证 - 请参阅How to: Implement Remote Validation in ASP.NET MVC