Пример #1
0
        //Implements

        #region # 执行参数模型绑定 —— async Task BindModelAsync(ModelBindingContext bindingContext)
        /// <summary>
        /// 执行参数模型绑定
        /// </summary>
        public async Task BindModelAsync(ModelBindingContext bindingContext)
        {
            HttpContext httpContext = bindingContext.HttpContext;

            #region # 验证

            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }
            if (httpContext.Request.Method != HttpMethod.Post.ToString())
            {
                throw new InvalidOperationException("Only post method available !");
            }
            if (!httpContext.Request.ContentType.StartsWith("application/json") &&
                !httpContext.Request.ContentType.StartsWith("application/x-www-form-urlencoded"))
            {
                bindingContext.Result = ModelBindingResult.Failed();
                return;
            }

            #endregion

            NameValueCollection parameters = await this.ParseParametersFromBody(httpContext.Request);

            string parameterValue = parameters.Get(bindingContext.FieldName);
            object typicalValue   = ParameterExtension.TypifyParameterValue(bindingContext.ModelType, parameterValue, this._jsonSerializerSettings);
            bindingContext.Result = ModelBindingResult.Success(typicalValue);
        }
        /// <summary>
        /// 执行参数绑定
        /// </summary>
        public override async Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            JsonSerializerSettings jsonSerializerSettings = actionContext.ControllerContext.Configuration.Formatters.JsonFormatter.SerializerSettings;

            NameValueCollection parameters = await this.ParseParametersFromBody(actionContext.Request, jsonSerializerSettings);

            string parameterValue = parameters.Get(base.Descriptor.ParameterName);
            object typicalValue   = ParameterExtension.TypifyParameterValue(base.Descriptor.ParameterType, parameterValue, jsonSerializerSettings);

            base.SetValue(actionContext, typicalValue);
        }
        /// <summary>
        /// 执行参数绑定
        /// </summary>
        public override async Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
        {
            #region # 验证

            if (!actionContext.Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }

            #endregion

            IDictionary <string, object> parameters = await this.ParseParametersFromBody(actionContext.Request);

            object parameterValue = parameters.ContainsKey(base.Descriptor.ParameterName)
                ? parameters[base.Descriptor.ParameterName]
                : null;

            if (parameterValue != null)
            {
                object paramValue;
                if (base.Descriptor.ParameterType == typeof(IFormFile))
                {
                    const string undefined = "undefined";
                    if (string.IsNullOrWhiteSpace(parameterValue.ToString()) || parameterValue.ToString() == undefined)
                    {
                        paramValue = null;
                    }
                    else
                    {
                        if (parameterValue is IFormFileCollection formFiles)
                        {
                            paramValue = formFiles[0];
                        }
                        else if (parameterValue is IFormFile formFile)
                        {
                            paramValue = formFile;
                        }
                        else
                        {
                            paramValue = null;
                        }
                    }
                }
                else if (base.Descriptor.ParameterType == typeof(IFormFileCollection))
                {
                    const string undefined = "undefined";
                    if (string.IsNullOrWhiteSpace(parameterValue.ToString()) || parameterValue.ToString() == undefined)
                    {
                        paramValue = new FormFileCollection();
                    }
                    else
                    {
                        if (parameterValue is IFormFileCollection formFiles)
                        {
                            paramValue = formFiles;
                        }
                        else if (parameterValue is IFormFile formFile)
                        {
                            FormFileCollection formFileCollection = new FormFileCollection();
                            formFileCollection.Add(formFile);

                            paramValue = formFileCollection;
                        }
                        else
                        {
                            paramValue = new FormFileCollection();
                        }
                    }
                }
                else
                {
                    //除文件外,按类型化参数处理
                    JsonSerializerSettings jsonSerializerSettings = actionContext.ControllerContext.Configuration.Formatters.JsonFormatter.SerializerSettings;
                    paramValue = ParameterExtension.TypifyParameterValue(base.Descriptor.ParameterType, parameterValue, jsonSerializerSettings);
                }

                base.SetValue(actionContext, paramValue);
            }
            else
            {
                base.SetValue(actionContext, null);
            }
        }
        //Implements

        #region # 执行参数模型绑定 —— Task BindModelAsync(ModelBindingContext bindingContext)
        /// <summary>
        /// 执行参数模型绑定
        /// </summary>
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            HttpContext httpContext = bindingContext.HttpContext;

            #region # 验证

            if (bindingContext == null)
            {
                throw new ArgumentNullException(nameof(bindingContext));
            }
            if (httpContext.Request.Method != HttpMethod.Post.ToString())
            {
                throw new InvalidOperationException("Only post method available !");
            }
            if (!httpContext.Request.ContentType.StartsWith("multipart/form-data"))
            {
                bindingContext.Result = ModelBindingResult.Failed();
                return(Task.CompletedTask);
            }

            #endregion

            IDictionary <string, object> parameters = this.ParseParametersFromBody(httpContext.Request);
            object parameterValue = parameters.ContainsKey(bindingContext.FieldName)
                ? parameters[bindingContext.FieldName]
                : null;
            if (parameterValue != null)
            {
                object typicalValue;
                if (bindingContext.ModelType == typeof(IFormFile))
                {
                    const string undefined = "undefined";
                    if (string.IsNullOrWhiteSpace(parameterValue.ToString()) || parameterValue.ToString() == undefined)
                    {
                        typicalValue = null;
                    }
                    else
                    {
                        if (parameterValue is IFormFileCollection formFiles)
                        {
                            typicalValue = formFiles[0];
                        }
                        else if (parameterValue is IFormFile formFile)
                        {
                            typicalValue = formFile;
                        }
                        else
                        {
                            typicalValue = null;
                        }
                    }
                }
                else if (bindingContext.ModelType == typeof(IFormFileCollection))
                {
                    const string undefined = "undefined";
                    if (string.IsNullOrWhiteSpace(parameterValue.ToString()) || parameterValue.ToString() == undefined)
                    {
                        typicalValue = new FormFileCollection();
                    }
                    else
                    {
                        if (parameterValue is IFormFileCollection formFiles)
                        {
                            typicalValue = formFiles;
                        }
                        else if (parameterValue is IFormFile formFile)
                        {
                            FormFileCollection formFileCollection = new FormFileCollection();
                            formFileCollection.Add(formFile);

                            typicalValue = formFileCollection;
                        }
                        else
                        {
                            typicalValue = new FormFileCollection();
                        }
                    }
                }
                else
                {
                    //除文件外,按类型化参数处理
                    typicalValue = ParameterExtension.TypifyParameterValue(bindingContext.ModelType, parameterValue, this._jsonSerializerSettings);
                }

                bindingContext.Result = ModelBindingResult.Success(typicalValue);
            }
            else
            {
                bindingContext.Result = ModelBindingResult.Success(null);
            }

            return(Task.CompletedTask);
        }