你的位置:首页 > 软件开发 > ASP.net > Fireasy与Asp.net MVC结合

Fireasy与Asp.net MVC结合

发布时间:2015-05-20 12:01:24
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 (#换成@)。