2

我迷失了应该在我的 asp.net mvc Web 应用程序中捕获异常的内容/位置/时间。以及如何为最终用户显示错误消息。例如,我得到了以下 Action 方法:-

    [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(ServerToEdit serverToEdit)
        {
try
        { 
        if (ModelState.IsValid) 
         {
         if (!(repository.IsIPUnique(serverToEdit.TechnologyIP.IPAddress, 0)))
        {
        ModelState.AddModelError("TechnologyIP.IPAddress", "Error occured. The Same IP might already assinged.");

                           return View(serverToEdit);
        }
        if (!(repository.IsServerNameUnique(serverToEdit.Server.Name, 0)))
        {
        ModelState.AddModelError("Server.Name", "Error occured. The Same Server Name might already assinged.");

                           return View(serverToEdit);
                       }
                        repository.InsertOrUpdateServer(serverToEdit.Server,serverToEdit.TechnologyIP,User.Identity.Name);
                        repository.Save();
                        return RedirectToAction("Index");
                    }

        else 
        {
        return View(serverToEdit);
        }
        }
    catch (DbUpdateException)
        {
        ModelState.AddModelError(string.Empty, "Error occured. The Same IP/Name might already assinged.");

        }
    catch (DbEntityValidationException)
                   {
                       ModelState.AddModelError(string.Empty, "Error occured. User might not be defiend inside Active Directory.");

                   }
         return View(serverToEdit);
        }

我对我的代码有以下问题:-

  1. 我有两种服务方法(IsIPUnique 和 IsServeNameUnique);但是控制器操作方法是从我的存储库模型类中调用这些服务方法的最佳位置吗?

  2. 目前如果服务方法失败,我手动编写模型状态错误并将视图返回给用户。那么这是为服务方法编写模型状态错误的正确方法吗?

  3. 如果引发了 DBUpdateException,我假设数据库中已经存在 IP 或服务名称(如果服务方法无法检查高流量应用程序,则可能会发生这种情况)。但是引发 DBUpdateException 的原因还有很多。所以我的问题是关于处理 DBUpdateException 的最佳方法是什么。并准确说明它被提出的原因?

4

3 回答 3

2

控制器通常是进行模型状态验证的正确位置,但是,正如我发现的那样,如果您要进行大量验证,那么它很容易使控制器膨胀。

我如何处理验证重控制器方法是将验证导出到服务,例如称为 ValidateServer(serverToEdit) 的静态方法。

然后在这个方法中,运行你所有的各种检查,并建立一个名为 errors 的字典,如果检查失败,则在这个字典中添加一个错误。

然后您可以将此字典传递回您的控制器,并使用 foreach 将错误添加到 ModelState。这样就只剩下您的异常处理了。

为了在您的 DBUpdateException 上提供用户信息,您应该能够通过异常 .InnerException 属性获取有关其发生原因的信息,您可以将其作为错误消息传递给用户。所以你会写:

catch (DbEntityValidationException ex)
               {
                   ModelState.AddModelError(string.Empty, "Error occurred:" + ex.InnerException);

               }

或类似的规定!

于 2013-08-01T16:30:33.343 回答
2

不要将验证与异常处理混为一谈。

在一个集中的地方处理异常并向最终用户记录和显示错误更有意义。这样,您可以使您的代码更具可读性和可维护性。CodeProject 有一篇关于这个主题的精彩文章。

于 2013-08-01T18:53:13.350 回答
1

我认为您可以添加另一层来包装调用并返回带有某种状态和错误(如果有)的结果,并在返回消息失败的情况下使用模型状态,这样您的控制器将更具可读性。

于 2013-08-01T16:18:28.610 回答