asp.net - 从我的模型类中捕获异常的最佳方法

标签 asp.net asp.net-mvc entity-framework

我不知道应该在什么/何处/何时捕获我的 ASP.NET MVC Web 应用程序中的异常。以及如何向最终用户显示错误消息。例如我有以下操作方法:-

    [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);但是 Controller 操作方法是从我的存储库模型类调用这些服务方法的最佳位置吗?

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

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

最佳答案

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

我处理验证重型 Controller 方法的方式是将验证导出到服务,例如名为 ValidateServer(serverToEdit) 的静态方法。

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

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

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

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

               }

或者类似的东西!

关于asp.net - 从我的模型类中捕获异常的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17999157/

相关文章:

javascript - 拖放后将 Google Map Marker 的新纬度和经度保存到文本框

c# - Web 服务方法签名更改为数据类型字符串 [] 的请求/响应对象

c# - GridView:隐藏标题上的排序箭头

c# - 检查 HttpHostedFileBase 中的文件名是文件名还是文件路径

javascript - Jquery ui 自动完成功能在部分 View 中不起作用

c# - EF Code First - 具有导航属性的多列索引

asp.net - 使用 wget 下载分块资源?

c# - 系统.InvalidOperationException : The model item passed into the dictionary is of type

entity-framework - Entity Framework 5 符号的可用性

.net - 查看 Entity Framework 的版本