.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (一)
.net core 1.1.0 MVC 控制器接收Json字串 (JObject对象) (二)
Json是WEB交互常见的数据,.net core 处理方式是转为强类型,没有对应的强类型会被抛弃,有时我们想自己在后台处理就想获得原始Json串,但.net core客户端的请求进行了默认的封装和转换。浏览器请求get,post,get不发Json,post发送请求有Form键值方式和Body数据方式,把键值对转成Json相对容易,这也是系列(一)的内容。
直接来思路,首先定义自己的ModelBinderProvider 如下:
1 2 3 4 5 6 7 8 9 10 11 12 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步