Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC实体框架验证以防止重复记录_Asp.net Mvc_Entity Framework_Validation - Fatal编程技术网

Asp.net mvc MVC实体框架验证以防止重复记录

Asp.net mvc MVC实体框架验证以防止重复记录,asp.net-mvc,entity-framework,validation,Asp.net Mvc,Entity Framework,Validation,您好,我是MVC和EF的新手,所以这可能是一个非常简单的问题,但是什么是防止用户尝试输入重复记录的最佳方法 我有一个简单的查找表,其中一列是主键。我正在创建一个维护屏幕,以便管理员可以向查找列表添加额外的项目。我的控制器看起来像: public ActionResult Index(string NewRow) { try { CaseType t = new CaseType { ID = NewRow };

您好,我是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());
    }
这将停止重复记录并停止死亡的黄色屏幕,但显示的消息是:“更新条目时出错。有关详细信息,请参阅内部异常。”这对用户没有好处


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

对于show validation error,我使用如下内容:

main通过电子邮件从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>

@LabelFor(model=>model.main电子邮件)
为了将来,你们必须隐藏你们的错误屏幕!您需要显示自定义错误页面:

如果使用asp-mvc-3,请将以下字符串添加到web.config:

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

...
用户将使用/Shared/Error.cshtml页面代替带有异常消息的页面(可以显示序列数据)

添加

这里讨论了关于唯一约束创建的问题

然后,您可以使用try代码检查记录重复

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

第一种方法稍微快一点


方法二是成熟的可测试性。

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

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

不太确定语法:)

Hmm…我的答案对你没有帮助?非常感谢,我正计划删除错误屏幕,它现在正在开发中,但感谢上面的提示。嗨,刚刚开始处理这个问题,虽然你的代码很有用,但实际上并没有达到我想要的效果。它似乎只是在表单数据中查找一个字段并添加一条验证消息。我正在寻找一种检查重复的方法,因此,例如,如果表中已经有案例类型“22”,并且某个用户试图创建另一个“22”,那么系统应该说“对不起,这是重复的”,而不是“bam”死亡黄屏。我只是想知道是应该首先对数据运行“find”还是捕获对服务器压力较小的错误?如果您还向服务器中的表列添加了唯一约束,那么捕获异常会更好(速度更快)。