使用MVC和流畅的Nhibernate,在将它们绑定到我的域对象并保存之前,如何验证ViewModel上的唯一字段?

sha*_*bus 11 model-view-controller asp.net-mvc castle fluent-nhibernate repository-pattern

我有一个网站,我允许用户创建新的部分记录.我正在试图找出验证特定字段的唯一性的最佳方法.我想确保有人不会尝试使用PartNumber 1234添加Part,如果PartNumber已经存在于另一个Part上.

Web应用程序使用具有流畅的nHibernate的Asp.net MVC将我的对象映射到数据库.我在我的视图模型上使用Castle验证来验证ValidateNonEmpty,ValidateRange等等.我应该使用ValidateSelf方法查询存储库以查看该部件号是否已存在?在ViewModel上使用我的存储库感觉不对.

将这个逻辑放在控制器动作上会更好吗?这似乎不对,因为我希望我的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);
}
Run Code Online (Sandbox Code Playgroud)

小智 1

我已经被问过很多次这个问题了。我的朋友担心他们是否可以从验证器代码执行数据访问。答案很简单。如果你需要这样做,你应该这样做。通常我们需要在每个抽象级别进行此类检查。在完成所有检查之后,您应该准备好捕获由于违反唯一约束而引起的异常。