我正在设置一个新的控制器使用现有的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]
标记的变通类?
1条答案
按热度按时间xkrw2x1b1#
你的c# SomeLocationInfo类和javascript对象有不同的属性名,你永远不会得到任何数据,直到你修复它。我不知道你正在使用的版本网,但也许你需要添加[FromBody]属性到操作输入参数。