我有一个网站,允许用户创建新的零件记录。我试图找出验证特定字段的唯一性的最佳方法。我想确保如果 PartNumber 已经存在于不同的 Part 上,则不会有人尝试添加 PartNumber 1234 的 Part。
Web 应用程序使用带有流利 nHibernate 的 Asp.net MVC 将我的对象映射到数据库。我在我的 View 模型上对 ValidateNonEmpty、ValidateRange 等使用 CaSTLe 验证。我应该使用 ValidateSelf查询存储库以查看该部件号是否已存在的方法?在 ViewModel 上使用我的存储库感觉有些不对劲。
把这个逻辑放在 Controller Action 上对我来说会更好吗?这似乎不对,因为我希望我的 ViewModel 已经被验证(在 ModelBind 期间)。
或者也许不是以上任何一种。感谢您对此的任何帮助。
更新
好的,不确定这是否会有所帮助,但对于我的项目中的典型创建操作,我的保存操作如下所示:
public ActionResult Create(PartViewModel viewModel)
{
//I think I'd like to know if its Valid by this point, not on _repository.Save
if(ModelState.IsValid)
{
try
{
var part = _partCreateViewModelMap.MapToEntity(viewModel);
_repository.Save(part);
return Redirect("~/Part/Details/" + part.Id);
}
catch (Exception e)
{
// skip on down...
}
}
// return view to edit
return View(viewModel);
}
最佳答案
我被问过很多次这个问题。我的 friend 们担心他们是否可以从验证器代码中执行数据访问。答案很简单。如果你需要这样做,你应该这样做。通常我们需要在每个抽象级别做这样的检查。在所有检查之后,您应该准备好捕获由违反唯一约束引起的异常。
关于asp.net-mvc - 使用 MVC 和流利的 Nhibernate,如何在将 ViewModel 上的唯一字段绑定(bind)到我的域对象并保存它们之前验证它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1440440/