控制器中的序列化C#类从axios post请求接收空值

0ve6wy6x  于 2023-03-18  发布在  iOS
关注(0)|答案(1)|浏览(168)

我正在设置一个新的控制器使用现有的C#类,序列化其属性。类定义如下:

[Serializable]
    public class SomeLocationInfo
    {
        public string Location { get; set; }
        public string Medium { get; set; }
        public List<ParameterPairs> ParameterPairsInfo { get; set; }

        SomeLocationInfo()
        {
            ParameterPairsInfo = new List<ParameterPairs>();
        }
    }

    [Serializable]
    public class ParameterPairs
    {
        public string Parameter { get; set; }
        public string Units { get; set; }
    }

我有一个新的后终点,如下所示:

[RoutePrefix("api/EnvdbMaps")]
  public class MapsController : ApiController
    {
        [HttpPost]
        [Route("RetrieveSelectedParametersForLocation")]
        public async Task<IHttpActionResult> RetrieveSelectedParametersForLocation(SomeLocationInfo locationData)

        {
            if (location.Medium == null)
            {
                return BadRequest();
            }

            try
            {
                // DO THINGS HERE 
                return Json("things were done");
            }
            catch (Exception ex)
            {
                // DO THINGS HERE
                return BadRequest();
            }
        }
  }

在我的JS文件中,我调用了这个端点。

try {
    const locationData = {
                SampleLocation: locationName,
                Medium: mediumName,
                ParameterPairs: [{
                            Parameter: parameterName,
                            Units: unitAmount
                           }]
                  };
                               
    const { data: response} = await axios.post(`/api/EnvdbMaps/RetrieveSelectedParametersForLocation/`, locationData);
                                
      } catch (err) {
              console.error(err);
     };

问题是这样的:
浏览器网络选项卡中的调用在API调用中具有正确的数据,并且数据类型与服务器上预期的数据类型匹配。我在C#服务器终结点中的调试断点每次都被命中。但是,传递到api终结点的参数值始终是默认对象(即Medium = null等)。
经过大量的实验,我们发现从C#类定义中删除[Serializable]属性可以修复这个错误。我们确实有一些旧的WebAPI代码使用了这个类,删除这个属性可能会导致其他问题。
有人能解释一下为什么这个标记会导致服务器上的值为null吗?有没有办法在两种情况下都重用这个类,并且不需要没有[Serializable]标记的变通类?

xkrw2x1b

xkrw2x1b1#

你的c# SomeLocationInfo类和javascript对象有不同的属性名,你永远不会得到任何数据,直到你修复它。我不知道你正在使用的版本网,但也许你需要添加[FromBody]属性到操作输入参数。

相关问题