Fireasy之前都是使用HttpService来为jquery ajax提供服务,这个HttpService实际上和MVC的原理机制是一样的,只是它支持两种方式,一种是使用统一的一个类来提供服务(基于MEF导入),另一种是使用aspx的类文件提供服务,具体使用哪一种,根据项目的 ...
Fireasy之前都是使用HttpService来为jquery ajax提供服务,这个HttpService实际上和MVC的原理机制是一样的,只是它支持两种方式,一种是使用统一的一个类来提供服务(基于MEF导入),另一种是使用aspx的类文件提供服务,具体使用哪一种,根据项目的性质来决定。
Asp.net MVC也就了解了一些皮毛,还不是很熟悉,正在深度学习中。不过基于以前的开发习惯,我觉得MVC要进行以下几点的改进:
(1)异常处理。MVC实现了一个异常滤过器HandleErrorAttribute,可以对执行action发生的异常进行处理,以便返回错误信息。但是它默认返回了一个View,我希望在发生异常时记录日志,并在前台进行友好的提示。
(2)Json序列化。翻出JsonResult的源代码来看,你会发现它的json序列化是由JavaScriptSerializer类完成的,对于这个类,我不想说什么。
(3)Action参数的反序列化。对于Fireasy的轻实体模型而言,它无法进行反序列化。
暂时先处理这三个问题吧,后来遇到问题再贴上来。
一、异常处理
在之前的开发模式中,我们都是使用ajax取数据和保存数据,我觉得相对于get='_blank'>mvc的model bind来说这样比较灵活,因为毕竟使用easyui,在取数的时候可能会有一些复杂的处理,我们都放在前台上编码吧。
在读取和保存数据的时候,避免不了会发生一些异常,如果按mvc的默认处理,我们将无法接收异常信息,这是一样相当头疼的事情。因此,我们对HandleErrorAttribute做一些改进:
对json的包装一会儿会说。如果是ClientNotificationException异常,直接显示错误信息,否则记录日志,返回提示信息。
/// <summary> /// 控制器方法执行发生异常时,记录日志并返回友好的提示信息。 /// </summary> public class HandleErrorAttribute : System.Web.Mvc.HandleErrorAttribute { /// <summary> /// 处理异常信息。 /// </summary> /// <param name="filterContext"></param> public override void OnException(ExceptionContext filterContext) { if (IsJsonResult(filterContext)) { HandleExceptionForJson(filterContext); } else { HandleException(filterContext); } LogException(filterContext); } /// <summary> /// 判断返回结果是否为 Json 类型。 /// </summary> /// <param name="filterContext"></param> /// <returns></returns> protected virtual bool IsJsonResult(ExceptionContext filterContext) { if (ActionContext.Current != null) { var desc = ActionContext.Current.ActionDescriptor as ReflectedActionDescriptor; if (desc != null) { return typeof(JsonResult).IsAssignableFrom(desc.MethodInfo.ReturnType); } } return false; } /// <summary> /// 处理返回结果为Json的异常信息。 /// </summary> /// <param name="filterContext"></param> protected virtual void HandleExceptionForJson(ExceptionContext filterContext) { //如果是通知类的异常,直接输出提示 var notifyExp = filterContext.Exception as Fireasy.Common.ClientNotificationException; if (notifyExp != null) { filterContext.Result = new JsonResultWrapper(new JsonResult { Data = Result.Fail(notifyExp.Message) }); filterContext.ExceptionHandled = true; return; } else { filterContext.Result = GetHandledResult(); filterContext.ExceptionHandled = true; } } /// <summary> /// 处理一般返回结果的异常信息。 /// </summary> /// <param name="filterContext"></param> protected virtual void HandleException(ExceptionContext filterContext) { var errorPage = ConfigurationManager.AppSettings["error-page"]; if (!string.IsNullOrEmpty(errorPage)) { filterContext.Result = new RedirectResult(errorPage); filterContext.ExceptionHandled = true; } } /// <summary> /// 记录异常日志。 /// </summary> /// <param name="filterContext"></param> protected virtual void LogException(ExceptionContext filterContext) { //记录日志 var logger = LoggerFactory.CreateLogger(); if (logger != null) { var controllerName = (string)filterContext.RouteData.Values["controller"]; var actionName = (string)filterContext.RouteData.Values["action"]; logger.Error(string.Format("执行控制器 {0} 的方法 {1} 时发生错误。", controllerName, actionName), filterContext.Exception); } } /// <summary> /// 获取处理后的返回结果。 /// </summary> /// <returns></returns> protected virtual ActionResult GetHandledResult() { if (ActionContext.Current != null) { //检查是否定义了 ExceptionBehaviorAttribute 特性 var attr = ActionContext.Current.ActionDescriptor .GetCustomAttributes(typeof(ExceptionBehaviorAttribute), false) .Cast<ExceptionBehaviorAttribute>().FirstOrDefault(); if (attr != null) { //返回空数组,一般用在列表绑定上 if (attr.EmptyArray) { return new JsonResultWrapper(new JsonResult { Data = new string[0] }); } //使用提示信息 else if (!string.IsNullOrEmpty(attr.Message)) { return new JsonResultWrapper(new JsonResult { Data = Result.Fail(attr.Message) }); } } } return new JsonResultWrapper(new JsonResult { Data = Result.Fail("发生错误,请查阅相关日志或联系管理员。") }); } }
原标题:Fireasy与Asp.net MVC结合
关键词:ASP.NET
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。