尝试显示创建/编辑视图时如何获取异常消息

时间:2019-04-28 20:48:25

标签: c# asp.net-mvc entity-framework

我有两个业务规则,我尝试申请:

  1. 用户只有在所有发票都关闭后才能插入新发票。
  2. 关闭发票后,用户无法编辑她。

发票有两个状态:当前,已关闭,已付款和已取消

为此,我已经在业务层的createe方法中实现了我的业务逻辑

,当用户尝试单击“提交”按钮时,httppost操作方法将调用业务代码。

但是我想将这些规则应用于httpget创建/编辑操作方法中,以便当用户尝试单击添加按钮以显示创建/编辑视图时,他分别收到有关创建和编辑的异常消息

这是我的代码

   //business logic
   public AddInvoice(Invoice invoice)
   {
       var invoicesCount = Context.Invoices.Count(x=>x.State != 
       InvoiceState.Closed);//InvoiceState is enum
       if (invoicesCount > 0)
            throw new BusinessReulesException("you should close all your 
          invoices before insert");

          Context.Invoices.Add(invoice);
          Context.SaveChanges();
   }

   public UpdateInvoice(Invoice invoice)
   {
       if (Context.Entry(invoice).State == EntityState.Detached)
  Context.Invoices.Attach(invoice);

       if (invoices.State == InvoiceState.Closed)
           throw new BusinessReulesException("you can't update an closed invoices );

       Context.Entry(invoice).State =EntityState.Modified;
       Context.SaveChanges();
   }

  //controller code
  [httpGet]
  public ActionResult Create()
  {
     //how to apply business logic for catch Exception here
  }
  [httpPost]
  public ActionResult Create(Invoice invoice)
  {
      if(ModelState.isValide){
      try{
           invoiceBll.AddInvoice(invoice);
           return RedirectToAction("Index");
      }
      catch(BusinessRulesException ex){
             ViewBag.Message = ex.Message;
      }
   }
}
//the same thing for update
//the rest of code

有什么主意吗?

2 个答案:

答案 0 :(得分:0)

为了保持代码干净,可以使用内置的HandleError过滤器。喜欢:

[HandleError(View = "Your_Error_View")]
public ActionResult Create(Invoice invoice)
{
  if(ModelState.isValide)
  {
    try
    {
       invoiceBll.AddInvoice(invoice);
       return RedirectToAction("Index");
    }
    catch(BusinessRulesException ex)
    {
         ViewBag.Message = ex.Message;
    }
  }
}
  

ASP.Net MVC HandleError属性提供了内置的异常筛选器。可以将ASP.NET MVC中的HandleError属性应用于操作方法以及控制器,也可以在全局级别应用,以处理控制器和操作级别的异常。创建我们的应用程序时,HandleError属性会自动包含在Global.asax.cs中,并在FilterConfig.cs中注册,如下所示。

还有几种方法来处理asp.net mvc中的错误:

  

Web.Config customErrors

     

Controller.OnException方法

     

HttpApplication Application_Error事件

     

通过带有Retrace的.NET分析收集异常

     

自定义中间件

编辑

可以在方法级别上指定它,并且可以为每种方法使用不同的错误视图,也可以为整个控制器指定一个错误视图。

错误数据可以传递到错误视图,以便您可以在其中显示

答案 1 :(得分:0)

您必须编写一个单独的视图(例如Shared/ErrorPage.cshtml),该视图显示您存储在ViewBag中的错误消息。我认为那是为了什么,对不对?

<h2>You encountered an error!</h2>
<div class="flashing-red" id="ErrorMessage">@ViewBag.Message</div>
<img src="SadKitten.png">

然后在您的操作方法中,您要return that specific view而不是默认值:

[httpPost]
public ActionResult Create(Invoice invoice)
{
    if(ModelState.isValide){
    try{
         invoiceBll.AddInvoice(invoice);
         return RedirectToAction("Index");
    }
    catch(BusinessRulesException ex){
         ViewBag.Message = ex.Message;
         return View("~/Shared/ErrorPage.cshtml");  //<<<<-- this is new
    }
 }

注意:渲染代码引发的原始异常消息,供最终用户阅读may not be the best practice