【问题标题】:MVC Entity Framework validation to prevent duplicate recordsMVC 实体框架验证以防止重复记录
【发布时间】:2011-09-16 10:35:03
【问题描述】:

您好,我是 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());
    }

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

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

【问题讨论】:

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


    【解决方案1】:

    对于显示验证错误,我使用如下内容:

    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 中添加这样的字符串:

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

    并且用户将在 /Shared/Error.cshtml 页面中插入带有异常消息的页面(可以显示 sequrity 数据)。

    添加

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

    您可以使用您的尝试代码检查记录重复。

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

    第一种方法要快一点。

    方法二是可测试性。

    【讨论】:

    • 嗯...我的回答对你没有帮助?
    • 非常感谢,我正计划删除错误屏幕,它目前正在开发中,但感谢您的提示。
    • 嗨,刚刚开始搞砸这个,虽然你的代码很有帮助,但它实际上并没有实现我想要的。它似乎只是在表单数据中寻找一个字段并添加一条验证消息。我一直在寻找一种检查重复项的方法,例如,如果我在表中已经有案例类型“22”,并且在某个时候用户尝试创建另一个“22”,系统应该说“对不起,那是重复的”而不是“bam”黄屏死机。只是想知道我是应该先对数据运行“查找”还是捕获对服务器压力较小的错误?
    • 如果你还给服务器中的表列添加唯一约束,如果你捕捉异常更好(更快)。
    【解决方案2】:

    如果你想得到内部异常,你可以这样做,

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

    不太确定语法:)

    【讨论】:

      猜你喜欢
      • 2014-04-10
      • 2018-09-13
      • 1970-01-01
      • 2015-04-19
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多