如果对象已存在,ASP.NET MVC会在表单提交后显示隐藏的div

时间:2017-07-25 08:55:29

标签: c# asp.net asp.net-mvc

我有一个表单,用户可以在其中创建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);
}

目前,如果项目NameID已经存在,它只返回包含来自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后显示警报?

1 个答案:

答案 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