MVC实体框架验证,以防止重复记录

时间:2011-09-16 10:35:04

标签: asp.net-mvc entity-framework validation

您好我是MVC和EF的新手,所以这可能是一个非常简单的问题,但阻止用户尝试输入重复记录的最佳方法是什么?

我有一个简单的查找表,其中一列是主键。我正在创建维护屏幕,因此管理员可以在查找列表中添加额外的项目。我的控制器看起来像:

public ActionResult Index(string NewRow)
    {
        try
        {
            CaseType t = new CaseType { ID = NewRow };
            if (ModelState.IsValid)
            {
                UOW.CaseTypes.Add(t);
                UOW.Save();
            }
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
        }
        return View(UOW.CaseTypes.All());
    }

停止重复记录并停止黄色死亡屏幕,但显示的消息是:“更新条目时发生错误。有关详细信息,请参阅内部异常。”这对用户没有好处。

我只是想知道是否有更好的方法来捕捉错误。

2 个答案:

答案 0 :(得分:3)

对于显示验证错误,我使用类似这样的内容:

MainEmail来自ViewModel的属性

        var mod = ModelState.First(c => c.Key == "MainEmail");  // this
        mod.Value.Errors.Add("Row's shouldn't duplicates.");    // this

        if (ModelState.IsValid)
        {
            return RedirectToAction("Details");
        }

        return View(client);

错误将在视野中的此字段中显示:

    <div class="editor-label">
        @Html.LabelFor(model => model.MainEmail)
    </div>

将来,您必须隐藏错误屏幕!您需要显示自定义错误页面:

如果您使用asp-mvc-3,请将web.config添加为string:

  <system.web>
     <customErrors mode="On" defaultRedirect="~/Error" />
     ...

用户将在页面中添加/Shared/Error.cshtml页面,其中包含异常消息(可显示sequrity数据)。

添加

这里讨论了关于唯一约束创建的问题 Unique Constraint in Entity Framework Code First

比你可以用你的试用代码检查记录重复。

在我的应用程序中,我首先使用代码,不添加唯一约束,因为它会导致可测试性低。在这种情况下,请在保存更改之前使用简单的查找

第一个方法有点快。

方法二是成长可测试性。

答案 1 :(得分:0)

如果您想获得内部异常,可以这样做,

catch (Exception ex)
        {
           while(ex.InnerException!=null){
                 ex=ex.InnerException;
           }
            ModelState.AddModelError("", ex.Message);
        }

对语法不太确定:)