我如何允许空值传递给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>

我如何允许空值传递给MVC WebApi的双类型

如果必须处理一个空的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>