Asp.net mvc MVC实体框架验证以防止重复记录
您好,我是MVC和EF的新手,所以这可能是一个非常简单的问题,但是什么是防止用户尝试输入重复记录的最佳方法 我有一个简单的查找表,其中一列是主键。我正在创建一个维护屏幕,以便管理员可以向查找列表添加额外的项目。我的控制器看起来像: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 };
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”还是捕获对服务器压力较小的错误?如果您还向服务器中的表列添加了唯一约束,那么捕获异常会更好(速度更快)。