ASP.NET MVC:如何让我的业务规则验证冒泡到表示层?

Luc*_*Sam 6 c# asp.net-mvc

对于我的每个业务实体,我都有一个相应的视图模型.

我有一个通用的CRUD控制器,其工作方式如下:

    [HttpPost]
    public virtual ActionResult Create(TViewModel model, int? id)
    {
        // Validate input
        if (!ModelState.IsValid)
            return Json(Failure(createView, model.SelectLists(repository)));

        // Prepare Model
        var entity = new TModel();

        // Add to repository
        UpdateModel(entity);
        repository.Add(entity);
        repository.Save();
        return Json(CreateSuccess(entity));
    }
Run Code Online (Sandbox Code Playgroud)

我在视图模型属性上使用数据注释,这对于简单的输入验证非常有用.

现在我有一个案例,我想确保不会偶然创建重复记录.

我的第一直觉是将这个逻辑放在存储库的Add方法中.这个实现很简单,但是如何让存储库添加模型状态错误并将一些有用的信息返回给用户?我觉得必须有一个解决方案,但我没有太多的运气搜索.

谢谢你的帮助!

Luk*_*uke 3

我会使用异常。

  • 如果实体加倍,则在 Add 方法中引发自定义应用程序异常。
  • 将 Add 方法包装在 try 块中,以在 Create 方法中捕获此特定异常。
  • 根据 catch 块处的异常数据添加模型状态错误

    try
    {
        repository.Add(entity);
    }
    catch(MyRepositoryException ex)
    {
        ViewData.ModelState.AddModelError(ex.Key, ex.Value.ToString(), ex.Message)
    }
    
    if (!ModelState.IsValid)
                return Json(Failure(createView, model.SelectLists(repository)));
    
    Run Code Online (Sandbox Code Playgroud)