как получить сообщение об исключении при попытке отобразить представление создания / редактирования - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть два бизнес-правила, я пытаюсь их применить:

  1. пользователь может вставить новый счет только тогда, когда все счета закрыты.
  2. когда счет закрыт, пользователь не может его редактировать.

счет имеет два состояния: текущий, закрытый, оплаченный и отмененный

дляЯ реализовал свою бизнес-логику в методе создания на бизнес-уровне

, и когда пользователь пытается нажать кнопку отправки, метод действия 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 голосов
/ 29 апреля 2019

Вам нужно написать отдельное представление (например, Shared/ErrorPage.cshtml), которое отображает то сообщение об ошибке, которое вы храните в ViewBag. Я предполагаю, что это то, для чего это, верно?

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

Затем в вашем методе действия вы хотите вернуть это конкретное представление вместо значения по умолчанию:

[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
    }
 }

Примечание. Передача исходного сообщения об исключении, выдаваемого вашим кодом для конечного пользователя, для чтения может быть не лучшей практикой .

0 голосов
/ 29 апреля 2019

Чтобы сохранить ваш код в чистоте, вы можете использовать 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 предоставляет встроенный фильтр исключений. Атрибут HandleError в ASP.NET MVC может применяться к методу действия, а также к контроллеру или на глобальном уровне для обработки исключения на уровне контроллера и действия. При создании нашего приложения атрибут HandleError автоматически включается в Global.asax.cs и регистрируется в FilterConfig.cs, как показано ниже.

Еще несколько способов обработки ошибок в asp.net mvc:

Web.Config customErrors

Controller.OnException метод

Событие HttpApplication Application_Error

Сбор исключений с помощью профилирования .NET с Retrace

Пользовательское промежуточное ПО

EDIT

Это может быть указано на уровне метода, и вы можете использовать разные представления ошибок для каждого метода, или вы можете указать одно представление ошибок для всего контроллера.

Данные об ошибках могут быть переданы в окно ошибок, чтобы вы могли отображать их там

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...