终于到了MVC的UI层了,也终于要到StructureMap了,不容易啊。本篇文章介绍ASP.NET MVC三层架构中的Controller和View,以及系统中异常处理。
Controller和View
其实View没有什么介绍的,就是显示。本章的重点在Controller层,这一层需要注入Service层,同时会有异常处理,具体的异常处理的实现会在下篇文章介绍,本片只是说明一下怎么使用本系统中的异常处理类。
Controller
MVC中的Controller翻译过来是控制器,没错我们只用他来跳转,这里不存在任何的业务逻辑,仅仅向Service中传递View中的数据,然后Service处理业务并返回我们需要结果,之后进行跳转。为什么异常处理放在这里呢,因为我们需要把有好的错误信息返回到页面中,构建一个友好的页面交互。
BaseController的实现
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using TYStudioDemo.Interfaces;
- namespace TYStudioDemo.WebUI.Controllers
- {
- public abstract class BaseController : Controller
- {
- protected ITYExceptionService _tyExceptionService;
- public BaseController() { }
- public BaseController(ITYExceptionService tyExceptionService)
- {
- _tyExceptionService = tyExceptionService;
- }
- }
- }
每个单独的Controller都要继承自BaseController,BaseController中放入Controller中一般常用的Service,本系统只放入了ExceptionService,如果你在开发的时候发现很多Controller都需要注入相同的Service,没错把他们放到BaseController是一个很好地选择。
SupplierController
同样今天只介绍SupplierController的实现,其他举一反三~
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Mvc;
- using TYStudioDemo.Interfaces;
- using TYStudioDemo.DTO;
- namespace TYStudioDemo.WebUI.Controllers
- {
- public class SupplierController : BaseController
- {
- ISupplierService _supplierService;
- public SupplierController(ITYExceptionService tyExceptionService,
- ISupplierService supplierService)
- {
- _tyExceptionService = tyExceptionService;
- _supplierService = supplierService;
- }
- public ActionResult Index()
- {
- return View(_supplierService.GetAll());
- }
- public ActionResult Details(int id)
- {
- return View(_supplierService.GetByID(id));
- }
- public ActionResult Create()
- {
- return View();
- }
- [HttpPost]
- public ActionResult Create(SupplierViewModel vModel)
- {
- ActionResult result;
- try
- {
- _supplierService.Create(vModel);
- result = RedirectToAction("Index");
- }
- catch(Exception ex)
- {
- //定义Dictionary用来存储非法的对象
- //根据实际需求,添加相应的数据,也可以不填任何数据
- Dictionary<string, object> parms = new Dictionary<string, object>();
- //返回错误信息,并将异常记入TYStudio_Logging数据库。
- ViewData["ErrorMessage"] = _tyExceptionService.HandleException(ex, parms, ex.Message);
- result = View(vModel);
- }
- return result;
- }
- public ActionResult Edit(int id)
- {
- return View(_supplierService.GetByID(id));
- }
- [HttpPost]
- public ActionResult Edit(SupplierViewModel vModel)
- {
- try
- {
- _supplierService.Update(vModel);
- return RedirectToAction("Index");
- }
- catch
- {
- return View();
- }
- }
- public ActionResult Delete(int id)
- {
- return View(_supplierService.GetByID(id));
- }
- [HttpPost]
- public ActionResult Delete(int id, FormCollection collection)
- {
- try
- {
- _supplierService.Delete(id);
- return RedirectToAction("Index");
- }
- catch(Exception ex)
- {
- //定义Dictionary用来存储非法的对象
- //根据实际需求,添加相应的数据,也可以不填任何数据
- Dictionary<string, object> parms = new Dictionary<string, object>();
- //返回错误信息,并将异常记入TYStudio_Logging数据库。
- ViewData["ErrorMessage"] = _tyExceptionService.HandleException(ex, parms, ex.Message);
- return View(_supplierService.GetByID(id));
- }
- }
- }
- }
Create(SupplierViewModel vModel) Action
SupplierController中主要介绍的是这个方法,首先我们定义一个规则,一个Action中只有一个return方便以后的维护。然后看一下我们的异常处理Try Catch。这里我们通过_tyExceptionService.HandleException这个方法进行异常的日志记录,这个方法的详细实现将在Exception异常处理文章中向大家说明。用ViewData["ErrorMessage"]传递HandleException方法返回的异常信息到View,当出现异常的时候页面就会看到相应的信息了。
UI的显示层View
这一层如果用到强类型View,我们不适用Entity而是DTO工程中的ViewModel,主要是把UI层和Model层分开,降低耦合度。
ViewData["ErrorMessage"]这个错误信息,你可以在页面上找一个合适的位置显示出来就ok了,通常我们把它放到master母版页中。
Controller中的权限管理
这个问题对于mvc4你可以参考天屹的MVC4 SimpleMembership权限管理系统的实现,加到里面就可以了。
总结:
BaseController的添加使得我们可以把公共的Service都管理起来一起注入。减少了单独Controller中的代码维护。Exception在Controller中捕获,同样更加利于系统的维护。
下一篇我们介绍StructMap的配置,与如何把Service注入到Controller,Repository注入到Service中的具体实现。