首页 新闻 会员 周边

asp.net core 2 的 api Controller ,form 提交的参数 为空值 后台获取的却是null

0
悬赏园豆:15 [待解决问题]

前端通过jquery类库post的json类型对象到后台

dataType: "json",

contentType: "application/x-www-form-urlencoded; charset=utf-8"

后台的方法接收的数据

public ApiResult<dynamic> List(string Name, int PageIndex, int PageSize)

其中Name前端发送的是"",我调试用Request.Form["Name"]也能得到""

然后直接调用Name获取到的却是null ?

我在Startup的services.AddMvc()也添加了AddJsonOptions方法并对序列化做了重新配置,可是怎么也解决不了上述的问题.有大神了解的告知一下如何解决啊!!

问题补充:

前端脚本

jQuery.ajax({
            type: "POST",
            global: false,
            url: "/Api/Department/List",
            success: function (data) {
                if (typeof (AjaxCallback) == "function")
                    AjaxCallback(data);
            },
            cache: false,
            data: {Name:"",PageIndex:1,PageSize:20},
            dataType: "json",
            contentType: "application/x-www-form-urlencoded; charset=utf-8"
        });

后台代码

[Produces("application/json")]
    [Route("api/[controller]/[action]")]
    public class DepartmentController : Controller
    {
        // POST api/Department/List
        public ApiResult<dynamic> List(string Name, int PageIndex, int PageSize)
        {
            dynamic data;
            //这里接收到的Name如果前端有值如"aa"后台可以正常接收到
            //但是如果发送的值为"",后台收到的就是null
            //但是我用Request.Form["Name"]来接收,前端发送的是"",后台收到的也是""
    
            return new ApiResult<dynamic>(data);
        }
    }

 

lpyedge的主页 lpyedge | 菜鸟二级 | 园豆:330
提问于:2018-01-18 18:38
< >
分享
所有回答(5)
0

加上 "[FromBody]" 试试

dudu | 园豆:31007 (高人七级) | 2018-01-18 18:44

我是用form提交的,不是用body

支持(0) 反对(0) lpyedge | 园豆:330 (菜鸟二级) | 2018-01-19 11:03

@lpyedge: form提交不就是走body吗

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2018-01-19 13:00
0

你js中传数据的代码怎么写的。

BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2018-01-18 18:49

已补充问题,麻烦给看看到底如何解决?

支持(0) 反对(0) lpyedge | 园豆:330 (菜鸟二级) | 2018-01-19 11:12

@lpyedge:

var data = {}
data.Name="";
data.PageIndex = 1;
data.PageSize = 20;

jQuery.ajax({
            type: "POST",
            global: false,
            url: "/Api/Department/List",
            success: function (data) {
                if (typeof (AjaxCallback) == "function")
                    AjaxCallback(data);
            },
            cache: false,
            data: data,
            dataType: "text",
            contentType: "application/x-www-form-urlencoded; charset=utf-8"
        });

你改成这样试试。

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2018-01-19 11:29

@BUTTERAPPLE: 测试了一下,dataType改成"text"结果照旧

支持(0) 反对(0) lpyedge | 园豆:330 (菜鸟二级) | 2018-01-19 11:54

@lpyedge: 我明白你的意思了,就是你想把 "" 传给 controller 但是 controller里面接受到的是 null

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2018-01-19 12:14

@BUTTERAPPLE: yes,就是这个问题,我认为是mvc的json序列化的问题,可是我在startup里面设置

services.AddMvc()
                //AddJsonOptions mvc json序列化全局设置
                .AddJsonOptions(options=> {
                    NewtonsoftDefaultSettings.Default(options.SerializerSettings);
                }); 
public static class NewtonsoftDefaultSettings
    {
        public static void Default(Newtonsoft.Json.JsonSerializerSettings setting)
        {

            setting.DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat;
            setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";


            setting.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include;
            setting.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include;
            setting.ContractResolver = new Newtonsoft.Json.Serialization.DefaultContractResolver();
            setting.ConstructorHandling = Newtonsoft.Json.ConstructorHandling.Default;
            setting.StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.Default;
            setting.FloatParseHandling = Newtonsoft.Json.FloatParseHandling.Double;
            setting.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace;
            setting.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        }

    }

只解决了属性默认小写的问题,现在是和属性名的大小写一致了,但是无论如何修改NullValueHandling和DefaultValueHandling都无法正常接收到""

支持(0) 反对(0) lpyedge | 园豆:330 (菜鸟二级) | 2018-01-19 12:23

@lpyedge: 只能使用楼上所说的[FromBody]来接收,本地测试使用FromBody 可以正常接收

支持(0) 反对(0) BUTTERAPPLE | 园豆:3190 (老鸟四级) | 2018-01-19 13:18
0

加上 "[FromForm]" 试试 ?

死神的背影 | 园豆:667 (小虾三级) | 2018-06-28 16:33
0

最后怎么处理的?为啥get传参后台取也是Null

厦门_成 | 园豆:202 (菜鸟二级) | 2018-11-01 15:25
0

最后怎么处理的?为啥get传参后台取也是Null

领悟.海洋 | 园豆:210 (菜鸟二级) | 2020-03-20 15:40

用[FromForm]string Name就可以了

支持(0) 反对(0) 领悟.海洋 | 园豆:210 (菜鸟二级) | 2020-03-20 15:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册