您好我是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());
}
停止重复记录并停止黄色死亡屏幕,但显示的消息是:“更新条目时发生错误。有关详细信息,请参阅内部异常。”这对用户没有好处。
我只是想知道是否有更好的方法来捕捉错误。
答案 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);
}
对语法不太确定:)