Exemple #1
0
 /// <summary>
 /// 构造
 /// </summary>
 /// <param name="customerValidatorType">自定义的fluent验证类</param>
 /// <param name="errorResultReturnType">发生错误的返回数据格式类型</param>
 public MoonBaseFluent(Type customerValidatorType, ErrorResultReturnType errorResultReturnType)
 {
     _customerValidatorType   = customerValidatorType;
     FluentValidateResultType = errorResultReturnType;
 }
Exemple #2
0
        /// <summary>
        /// 获取一个方法的参数对应的值(或实体)
        /// </summary>
        /// <param name="Request">HttpRequest对象</param>
        /// <param name="methodInfo">方法信息</param>
        /// <returns>参数对应的值</returns>
        public static Object[] GetParametersObject(bool dontValidateRequest, HttpRequest Request, MethodInfo methodInfo,
                                                   ref List <ValidationResult> validateResultList, ref ErrorResultReturnType errorResultReturnType)
        {
            List <object> list       = new List <object>();
            var           dic        = ConvertRequestToDictionary(Request, dontValidateRequest);
            var           dicdic     = GroupDictonary(dic);
            var           parameters = methodInfo.GetParameters();

            foreach (var para in parameters)
            {
                var paraType = para.ParameterType;
                var paraName = para.Name;
                if (paraType == typeof(string))
                {
                    object entity = string.Empty;
                    if (dicdic.ContainsKey(string.Empty))
                    {
                        foreach (var kvp in dicdic[string.Empty])
                        {
                            if (string.Equals(kvp.Key, paraName, StringComparison.OrdinalIgnoreCase))
                            {
                                entity = TypeUtil.ConvertTo(kvp.Value, paraType);
                                break;
                            }
                        }
                    }
                    list.Add(entity);
                }
                else if (paraType.IsClass)
                {
                    var entity = Activator.CreateInstance(paraType, null);
                    SetEntityValueByDicDic(dicdic, entity, para);
                    var paraAttributes = para.GetCustomAttributes(typeof(MoonBaseFluent), false);
                    if (paraAttributes != null && paraAttributes.Length > 0)
                    {
                        var paraAttribute = paraAttributes[0] as MoonBaseFluent;
                        errorResultReturnType = paraAttribute.FluentValidateResultType;
                        var validaterRsult = paraAttribute.Validate(entity);
                        validateResultList.Add(validaterRsult);
                    }
                    list.Add(entity);
                }
                else if (paraType.IsValueType)
                {
                    var entity = Activator.CreateInstance(paraType, null);
                    if (dicdic.ContainsKey(string.Empty))
                    {
                        foreach (var kvp in dicdic[string.Empty])
                        {
                            if (string.Equals(kvp.Key, paraName, StringComparison.OrdinalIgnoreCase))
                            {
                                entity = TypeUtil.ConvertTo(kvp.Value, paraType);
                                break;
                            }
                        }
                    }
                    list.Add(entity);
                }
            }
            return(list.ToArray());
        }
Exemple #3
0
 /// <summary>
 /// 构造
 /// </summary>
 /// <param name="type">Fluent的验证类,如,UserValidator : AbstractValidator&ltuser&gt</param>
 /// <param name="fluentValidateResultType">错误默认返回格式,如果是json格式出现错误则终止
 /// 如果是数据格式,则交用户自己解决</param>
 public ValidatorAttribute(Type type, ErrorResultReturnType fluentValidateResultType)
     : base(type, fluentValidateResultType)
 {
 }
Exemple #4
0
        /// <summary>
        /// moon所有的请求
        /// </summary>
        /// <param name="classFullName">类的完全限定名</param>
        /// <param name="methodName">方法名(只能是public)</param>
        /// <param name="context">当前的HttpContext</param>
        public static void Process(string classFullName, string methodName, HttpContext context)
        {
            var classType     = ControllerAssmeblyUtil.CreateType(classFullName);
            var classInstance = ControllerAssmeblyUtil.CreateInstance(classFullName);

            if (classInstance == null)
            {
                Moon.Orm.Util.LogUtil.Error("classInstance null,classFullName:" + classFullName + "  " + context.Request.RawUrl);
                var err = "current request doesn't exist";
                throw new Exception(err);
            }
            if (classType == null)
            {
                var err = "current request doesn't exist";
                throw new Exception(err);
            }

            var methodInfo = classType.GetMethod(methodName, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance);

            if (methodInfo == null)
            {
                return;
            }
            //=================
            BaseController baseControllerInstance = null;
            Dictionary <string, object> viewData  = new Dictionary <string, object>();

            if (classInstance is BaseController)
            {
                BaseController obj = classInstance as BaseController;
                obj.CurrentHttpContext = context;
                viewData = obj.ViewData;
                baseControllerInstance = obj;
            }
            else
            {
                throw new Exception("请求的类没有继承BaseController");
            }
            var             atts       = methodInfo.GetCustomAttributes(typeof(ResultAttribute), true);
            ResultAttribute resultAttr = null;

            if (atts.Length > 0)
            {
                resultAttr = atts[0] as ResultAttribute;
            }
            else
            {
                resultAttr = new TemplateResultAttribute();//默认为模板类型
            }
            //------------
            object resultObj = null;
            //------------
            var customAspectAttributes = methodInfo.GetCustomAttributes(typeof(AspectAttribute), true);

            List <ValidationResult> resultList = new List <ValidationResult>();
            ErrorResultReturnType   fluentValidateResultType = ErrorResultReturnType.Json;
            bool dontValidateRequest = ExistAttribute <DontValidateRequestAttribute>(methodInfo);
            int  methodRequestType   = GetMethodSupportRequestType(methodInfo);

            if (context.Request.RequestType == "GET")
            {
                if (methodRequestType == (int)RequestType.POST)
                {
                    var err = "Current request is GET,but you didn't set a GET attribute to your method :" + classFullName + "->" + methodName;
                    Moon.Orm.Util.LogUtil.Error(err);
                    throw new Exception(err);
                }
            }
            else
            {
                if (methodRequestType == (int)RequestType.GET)
                {
                    var err = "Current request is POST,but you didn't set a POST attribute to your method :" + classFullName + "->" + methodName;
                    Moon.Orm.Util.LogUtil.Error(err);
                    throw new Exception(err);
                }
            }

            object[] parameters = ParameterUtil.GetParametersObject(dontValidateRequest, context.Request, methodInfo, ref resultList, ref fluentValidateResultType);
            //---------验证参数----------
            if (ValidateMode(resultList) == false)
            {
                baseControllerInstance.IsModelValidate = false;
                if (fluentValidateResultType == ErrorResultReturnType.Json)
                {
                    var json = Moon.Orm.Util.JsonUtil.ConvertObjectToJson(resultList);
                    context.Response.Write(json);
                    context.Response.Flush();
                    //context.Response.End();//2015年9月13日14:03:43
                    return;
                }
                else if (fluentValidateResultType == ErrorResultReturnType.PureData)
                {
                    baseControllerInstance.ValidationResults = resultList;
                }
            }
            else
            {
                baseControllerInstance.IsModelValidate = true;
            }
            //
            if (customAspectAttributes.Length > 0)
            {
                List <AspectAttribute> aspectAttributeList = new List <AspectAttribute>();
                foreach (var oneAspect in customAspectAttributes)
                {
                    aspectAttributeList.Add(oneAspect as AspectAttribute);
                }
                OrderByAspectAttributePriority(aspectAttributeList);
                foreach (var oneAspect in aspectAttributeList)
                {
                    var aspectResult = oneAspect.BeforeInvoke(methodInfo, context);
                    if (aspectResult == AspectResultType.Stop)
                    {
                        return;
                    }
                }
                resultObj = MethodInvokeUtil.Invoke(classInstance, methodName, parameters.Length == 0 ? null : parameters);
                foreach (var oneAspect in aspectAttributeList)
                {
                    var rr = oneAspect.AfterInvoke(methodInfo, context);
                    if (rr == AspectResultType.Stop)
                    {
                        return;
                    }
                }
            }
            else
            {
                resultObj = MethodInvokeUtil.Invoke(classInstance, methodName, parameters.Length == 0 ? null : parameters);
            }
            resultAttr.Response(context, classFullName, methodName, resultObj, viewData);
        }