我如何允许空值传递给MVC WebApi的双类型
本文关键字:WebApi MVC 类型 何允许 空值 值传 | 更新日期: 2023-09-27 18:04:22
我有一个简单的WebApi 2.1项目,我收到一个模型状态错误,当我发布并离开一个非必需的可空字段(双类型)空白的值。我想保留xml元素,但允许它为空。我本以为让字段为空就可以处理这个问题,但是,如果我发布的薪水为空,我就会收到错误(如下所示)。如果我输入一个数字…如<salary>32000</salary>
,一切工作如预期
我怎么能允许一个空白值为一个可空的双精度仍然通过模型验证?
我收到的错误:
System.Web.Http.ModelBinding。ModelError: " XML中有一个错误文件(1,111)。"
我的模型:
public class Employee
{
[Required]
public string LastName { get; set; }
public string MiddleName { get; set; }
[Required]
public string FirstName { get; set; }
public double? Salary { get; set; }
}
My Controller Post Method:
public HttpResponseMessage Post([FromBody]Employee employee)
{
if (ModelState.IsValid)
{
string firstName = employee.FirstName;
string lastName = employee.LastName;
if (employee.Salary != null)
{
double? salary = employee.Salary;
}
return Request.CreateResponse(HttpStatusCode.OK);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.NoContent, ModelState);
}
}
这是我实际的帖子(列出了标题):
Content-Type: application/xml
Accept-Language: en-us
Accept: application/xml
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastName>Charlie</LastName>
<MiddleName>Bravo</MiddleName>
<FirstName>Alpha</FirstName>
<Salary></Salary>
</Employee>
如果必须处理一个空的Salary节点(而不是缺少一个),我会将模型更改为以下内容:
public class Employee
{
[Required]
public string LastName { get; set; }
public string MiddleName { get; set; }
[Required]
public string FirstName { get; set; }
public string Salary { get; set; }
public double? SalaryAmount
{ get
{
if (string.IsNullOrEmpty(Salary)) return null;
return double.parse(Salary);
}
]
}
免责声明:我手边没有VS,所以我无法验证我的代码。
然后在使用employee实例时必须使用SalaryAmount。这样做的原因是空XML元素的计算结果为string.Empty;缺少的XML元素计算结果为null。翻倍。解析不喜欢空字符串,这就是导致问题的原因。
我建议的另一件事是在处理金钱时不要使用浮点数;它引入了舍入和其他问题。我要把double改成decimal
我建议不要在XML中包含工资节点,如果它是空白的。试一下,它应该可以工作。
试试:user xsi:nil="true"
Content-Type: application/xml
Accept-Language: en-us
Accept: application/xml
<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<LastName>Charlie</LastName>
<MiddleName>Bravo</MiddleName>
<FirstName>Alpha</FirstName>
<Salary xsi:nil="true"></Salary>
</Employee>