2011-09-16 99 views
2

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

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

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()); 
    } 

停靠重复的记录,并停止死亡的黄色屏幕,但显示的信息是:“在更新条目中出现错误详细信息请参见内部异常。”这对用户不利。

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

回答

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

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

用户将必须/Shared/Error.cshtml网页insted的的带有异常消息的页面(可以显示sequrity数据)。

ADD

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

讨论比可以查看重复记录你的try代码。

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

首先应该快一点。

方法二是成长可测试性。

+0

嗯......我的回答不会帮你? –

+0

非常感谢,我正计划删除它刚刚开发的错误屏幕,但感谢顶尖提示。 – Jammy

+0

嗨,刚刚解决这个问题,而你的代码是有用的,它并没有真正实现我所期待的。它似乎只是在表单数据中寻找一个字段并添加验证消息。我正在寻找是一种检查重复的方法,例如,如果我已经在表中有案例类型“22”,并且在某个时刻用户试图创建另一个“22”,系统应该说“对不起这是重复的”而不是“死亡”的黄色屏幕。只是想知道如果我应该首先运行一个“查找”数据或捕获服务器上的紧张性较小的错误? – Jammy

0

如果你想获得的内部异常,你可以像这样,

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

没有太肯定的语法:)