我有两个业务规则,我尝试申请:
发票有两个状态:当前,已关闭,已付款和已取消
为此,我已经在业务层的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
有什么主意吗?
答案 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。