程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> .net core 1.1.0 MVC 控制器接收Json字串 (JObject對象) (一),jsonjobject

.net core 1.1.0 MVC 控制器接收Json字串 (JObject對象) (一),jsonjobject

編輯:關於.NET

.net core 1.1.0 MVC 控制器接收Json字串 (JObject對象) (一),jsonjobject


.net core 1.1.0 MVC 控制器接收Json字串 (JObject對象) (二)

    Json是WEB交互常見的數據,.net core 處理方式是轉為強類型,沒有對應的強類型會被拋棄,有時我們想自己在後台處理就想獲得原始Json串,但.net core客戶端的請求進行了默認的封裝和轉換。浏覽器請求get,post,get不發Json,post發送請求有Form鍵值方式和Body數據方式,把鍵值對轉成Json相對容易,這也是系列(一)的內容。

   直接來思路,首先定義自己的ModelBinderProvider 如下:

 public class JObjectModelBinderProvider : IModelBinderProvider
    {
        public IModelBinder GetBinder(ModelBinderProviderContext context)
        {
            if (context == null) throw new ArgumentNullException(nameof(context));
            if (context.Metadata.ModelType == (typeof(JObject)))
            {
                return new JObjectModelBinder(context.Metadata.ModelType);
            }
            return null;
        }
    }

 



接著編寫對應的ModelBinder

 

public class JObjectModelBinder : IModelBinder
    {
        public JObjectModelBinder(Type type)
        {
            if (type == null)
            {
                throw new ArgumentNullException("type");
            }
        }
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            if (bindingContext == null) throw new ArgumentNullException("bindingContext");
            ValueProviderResult result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            try
            {
                JObject obj = new JObject();
                if (bindingContext.ModelType == typeof(JObject))
                {
                    foreach (var item in bindingContext.ActionContext.HttpContext.Request.Form)
                    {
                        obj.Add(new JProperty(item.Key.ToString(), item.Value.ToString()));
                    }
                    if ((obj.Count == 0))
                    {
                        bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, bindingContext.ModelMetadata.ModelBindingMessageProvider.ValueMustNotBeNullAccessor(result.ToString()));
                        return Task.CompletedTask;
                    }
                    bindingContext.Result = (ModelBindingResult.Success(obj));
                    return Task.CompletedTask;
                }
                return Task.CompletedTask;
            }
            catch (Exception exception)
            {
                if (!(exception is FormatException) && (exception.InnerException != null))
                {
                    exception = ExceptionDispatchInfo.Capture(exception.InnerException).SourceException;
                }
                bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, exception, bindingContext.ModelMetadata);
                return Task.CompletedTask;
            }
        }
    }

 




最後將JObjectModelBinderProvider添加到Startup
            services.AddMvc(options =>
               {
                   options.ModelBinderProviders.Insert(0, new JObjectModelBinderProvider());//加入JobjectModelBinderProvider綁定
               });


使用
        [HttpPost]
        public IActionResult ComWizard(JObject data)
        {
            return new JsonResult(data);
        }
web端

 $.post("/Home/ComWizard", { UserName: "Jerry", Password: "123" }, function (data) {
                 alert(data.userName + "--" + data.password);//這是以Form鍵值對方式提交的,非Json,但在控制器會認為是JObject
             });


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved